java-文件和I/O

时间:2022-11-03 15:28:43

理解IO:http://www.importnew.com/23708.html

一、读写文件:

FileInputStream

该流用于从文件读取数据,它的对象可以用关键字 new 来创建。

有多种构造方法可用来创建对象。

可以使用字符串类型的文件名来创建一个输入流对象来读取文件:

InputStream f = new FileInputStream("C:/java/hello");

也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用 File() 方法来创建一个文件对象:

File f = new File("C:/java/hello");
InputStream out = new FileInputStream(f);

FileOutputStream

该类用来创建一个文件并向文件中写数据。

如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。

有两个构造方法可以用来创建 FileOutputStream 对象。

使用字符串类型的文件名来创建一个输出流对象:

OutputStream f = new FileOutputStream("C:/java/hello")

也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);
import java.io.*;

public class fileStreamTest2{
public static void main(String[] args) throws IOException { File f = new File("a.txt");
// 构建FileOutputStream对象,文件不存在会自动新建
FileOutputStream fop = new FileOutputStream(f);
// 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk
OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
// 写入到缓冲区
writer.append("中文输入");
//换行
writer.append("\r\n");
// 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入
writer.append("English");
//关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉
writer.close();
// 关闭输出流,释放系统资源
fop.close(); // 构建FileInputStream对象
FileInputStream fip = new FileInputStream(f);
// 构建InputStreamReader对象,编码与写入相同
InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
// 转成char加到StringBuffer对象中
StringBuffer sb = new StringBuffer();
while (reader.ready()) {
sb.append((char) reader.read());
}
System.out.println(sb.toString());
// 关闭读取流
reader.close();
// 关闭输入流,释放系统资源
fip.close(); }
}

写文件:

String tPath = request.getSession().getServletContext().getRealPath("/");
FileOutputStream outputStream = null;
try {
if (fileType.equals("doc") || fileType.equals("docx")) {
String folderPath = tPath.substring(0,tPath.lastIndexOf("\\")) + "/uploadfiles/conferencefile/"+topicInfo.getId();
tPath = folderPath +"/"+ fileName + "." + fileType;
//--------写入文件内容-----------------
File folder = new File(folderPath);
if(!folder.exists())
{
folder.mkdirs();
}
File file = new File(tPath);
if(!file.exists())
{
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
outputStream = new FileOutputStream(file);
byte[] bytes = Base64.decodeBase64(base64String);
outputStream.write(bytes,0,bytes.length);
//-----------------------------------
}
} catch (Exception e) {
}
finally {
try {
outputStream.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}

二、创建目录:

判断文件是否存在

File file = new File(filePath + builder.toString());
if(!file.exists())
{
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}

判断文件夹是否存在

File类中有两个方法可以用来创建文件夹:

  • mkdir( )方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
  • mkdirs()方法创建一个文件夹和它的所有父文件夹。
File filePath = new File("D:\\Video");
if (!filePath.exists()) {
filePath.mkdirs();
}

三、读取目录:

判断是文件夹还是文件

import java.io.File;

public class DirList {
public static void main(String args[]) {
String dirname = "/tmp";
File f1 = new File(dirname);
if (f1.isDirectory()) {
System.out.println( "目录 " + dirname);
String s[] = f1.list();
for (int i=0; i < s.length; i++) {
File f = new File(dirname + "/" + s[i]);
if (f.isDirectory()) {
System.out.println(s[i] + " 是一个目录");
} else {
System.out.println(s[i] + " 是一个文件");
}
}
} else {
System.out.println(dirname + " 不是一个目录");
}
}
}

四、删除目录或文件

删除文件可以使用 java.io.File.delete() 方法。

删除文件及目录

//删除文件及目录
public static void deleteFolder(File folder) {
File[] files = folder.listFiles();
if(files!=null) {
for(File f: files) {
if(f.isDirectory()) {
deleteFolder(f);
} else {
f.delete();
}
}
}
folder.delete();
}

五、读写excel文件

需要jxl.jar jar包支持,jxl.jar好像不支持.xlsx格式excel文件,需要把.xlsx格式的excel文件另存为.xls格式文件

使用poi读取excel文件,HSSFWorkbook与XSSFWorkbook,前一个可以用来解析以.xls结尾的excel,后一个可以用来解析.xlsx结尾的excel

poi:

//读取excel文件内容
List<User> userExcel = new ArrayList<>();
File file = null;
try {
file = new File(filePath);
} catch (Exception e) {
responseResult.setMsg("检查文件路径是否正确:"+filePath);
return responseResult;
}
FileInputStream fStream = new FileInputStream(file);
XSSFWorkbook xss = new XSSFWorkbook(fStream);
XSSFSheet sheet = xss.getSheetAt(0);
for(int i=0;i<sheet.getLastRowNum();i++) {
Row row = sheet.getRow(i);
User user = new User();
for(int j=0;j<row.getLastCellNum();j++) {
Cell cell = row.getCell(j, Row.CREATE_NULL_AS_BLANK);
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BLANK: break;
case Cell.CELL_TYPE_BOOLEAN: break;
case Cell.CELL_TYPE_NUMERIC:
// 数值 break;
case Cell.CELL_TYPE_STRING:
if (i != 0) {
String valueStr = cell.getStringCellValue();
if (j == 7) {
//登录名
user.setUserLoginNameHY(valueStr);
}else if (j == 9) {
//身份证
user.setUserCardEncryptionHY(valueStr);
}
}
break;
case Cell.CELL_TYPE_ERROR: break;
default:
break;
}
}
if (i!=0) {
userExcel.add(user);
} }

jxl:

public void readExcel(File file) {
try {
//读取excel文件内容
List<ExcelPollution> listPollution = new ArrayList<>();
List<ExcelClinic> listClinic = new ArrayList<>();
// 创建输入流,读取Excel
InputStream is = new FileInputStream(file.getAbsolutePath());
// jxl提供的Workbook类
Workbook wb = Workbook.getWorkbook(is);
// Excel的页签数量
//int sheet_size = wb.getNumberOfSheets();
//for (int index = 0; index < sheet_size; index++)
{
// 每个页签创建一个Sheet对象
Sheet sheet = wb.getSheet(0);
// sheet.getRows()返回该页的总行数
for (int i = 0; i < sheet.getRows(); i++) {
ExcelPollution excelPollution = new ExcelPollution();
// sheet.getColumns()返回该页的总列数
for (int j = 0; j < sheet.getColumns(); j++) {
String cellinfo = sheet.getCell(j, i).getContents();
if (j == 0) {
excelPollution.setLocation(cellinfo);
}
else if (j == 1) {
String dString = cellinfo;
if (i > 0) {
dString = "20" + cellinfo.replace("-", "/");
}
excelPollution.setDate(dString);
}
else if (j == 2) {
excelPollution.setSO2(cellinfo);
}
else if (j == 3) {
excelPollution.setNO2(cellinfo);
}
else if (j == 4) {
excelPollution.setPM10(cellinfo);
}
else if (j == 5) {
excelPollution.setCO(cellinfo);
}
else if (j == 6) {
excelPollution.setO3(cellinfo);
}
else if (j == 7) {
excelPollution.setPM25(cellinfo);
}
}
listPollution.add(i, excelPollution);
}
} File file2 = new File("D://Java//DoWork//clinic1.xls");
// 创建输入流,读取Excel
InputStream is2 = new FileInputStream(file2.getAbsolutePath());
// jxl提供的Workbook类
Workbook wb2 = Workbook.getWorkbook(is2);
// Excel的页签数量
//int sheet_size2 = wb2.getNumberOfSheets();
//for (int index = 0; index < sheet_size2; index++)
{
// 每个页签创建一个Sheet对象
Sheet sheet2 = wb2.getSheet(1);
// sheet.getRows()返回该页的总行数
for (int i = 0; i < sheet2.getRows(); i++) {
ExcelClinic excelClinic = new ExcelClinic();
// sheet.getColumns()返回该页的总列数
for (int j = 0; j < sheet2.getColumns(); j++) {
String cellinfo = sheet2.getCell(j, i).getContents();
if (j == 0) {
excelClinic.setStation(cellinfo);
}
else if (j == 1) {
String dString = cellinfo;
if (i > 0) {
dString = "20" + cellinfo.replace("-", "/");
}
excelClinic.setDate(dString);
}
else if (j == 2) {
excelClinic.setSO2(cellinfo);
}
else if (j == 3) {
excelClinic.setNO2(cellinfo);
}
else if (j == 4) {
excelClinic.setPM10(cellinfo);
}
else if (j == 5) {
excelClinic.setCO(cellinfo);
}
else if (j == 6) {
excelClinic.setO3(cellinfo);
}
else if (j == 7) {
excelClinic.setPM25(cellinfo);
}
else if (j == 8) {
excelClinic.setDiagnose(cellinfo);
}
else if (j == 9) {
excelClinic.setICD_10(cellinfo);
}
else if (j == 10) {
String dString = cellinfo;
if (i > 0) {
dString = "20" + cellinfo.replace("-", "/");
}
excelClinic.setDate_birth(dString);
}
else if (j == 11) {
excelClinic.setAge_0(cellinfo);
}
else if (j == 12) {
excelClinic.setGender(cellinfo);
}
else if (j == 13) {
excelClinic.setAge_1(cellinfo);
}
else if (j == 14) {
String dString = "20" + cellinfo.replace("-", "/");
excelClinic.setDate_discharge(dString);
}
else if (j == 15) {
excelClinic.setRegisted_address(cellinfo);
}
else if (j == 16) {
excelClinic.setAdmission_cost(cellinfo);
}
else if (j == 17) {
excelClinic.setAddress_present(cellinfo);
}
else if (j == 18) {
excelClinic.setICD(cellinfo);
}
else if (j == 19) {
excelClinic.setID(cellinfo);
}
} listClinic.add(i, excelClinic);
}
} if (listClinic.size() >0 && listPollution.size() > 0) {
for (ExcelClinic clinic : listClinic) {
for (ExcelPollution pollution : listPollution) {
if (pollution.getLocation().equals(clinic.getStation()) && pollution.getDate().equals(clinic.getDate())) {
clinic.setSO2(pollution.getSO2());
clinic.setNO2(pollution.getNO2());
clinic.setPM10(pollution.getPM10());
clinic.setCO(pollution.getCO());
clinic.setO3(pollution.getO3());
clinic.setPM25(pollution.getPM25());
try {
if (pollution.getPM10().equals("PM10") && pollution.getPM25().equals("PM2.5")) {
clinic.setPMc("PMc");
}
else if (!pollution.getPM10().equals("") && !pollution.getPM25().equals("") && pollution.getPM10() != null && pollution.getPM25() != null) {
Integer pMc = Integer.parseInt(clinic.getPM25()) - Integer.parseInt(clinic.getPM10());
clinic.setPMc(pMc.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
}
} //按照对象中的date日期进行排序
Collections.sort(listClinic, new Comparator<ExcelClinic>() {
@Override
public int compare(ExcelClinic o1, ExcelClinic o2) {
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
try {
Date dt1 = format.parse(o1.getDate());
Date dt2 = format.parse(o2.getDate());
if (dt1.getTime() > dt2.getTime()) {
return 1;
} else if (dt1.getTime() < dt2.getTime()) {
return -1;
} else {
return 0;
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
}); //写入excel文件
try {
// 打开文件
WritableWorkbook book = Workbook.createWorkbook(new File("D://Java//DoWork//test.xls"));
// 生成名为“sheet1”的工作表,参数0表示这是第一页
WritableSheet sheet = book.createSheet("sheet1", 0);
for (int i = 0; i<listClinic.size();i++) {
// 在Label对象的构造子中指名单元格位置是第一列第一行(0,0),单元格内容为string
Label label0 = new Label(0, i, listClinic.get(i).getStation());
// 将定义好的单元格添加到工作表中
sheet.addCell(label0);
Label label1 = new Label(1, i, listClinic.get(i).getDate());
sheet.addCell(label1);
Label label2 = new Label(2, i, listClinic.get(i).getSO2());
sheet.addCell(label2);
Label label3 = new Label(3, i, listClinic.get(i).getNO2());
sheet.addCell(label3);
Label label4 = new Label(4, i, listClinic.get(i).getPM10());
sheet.addCell(label4);
Label label5 = new Label(5, i, listClinic.get(i).getCO());
sheet.addCell(label5);
Label label6 = new Label(6, i, listClinic.get(i).getO3());
sheet.addCell(label6);
Label label7 = new Label(7, i, listClinic.get(i).getPM25());
sheet.addCell(label7);
Label label8 = new Label(8, i, listClinic.get(i).getPMc());
sheet.addCell(label8);
Label label9 = new Label(9, i, listClinic.get(i).getDiagnose());
sheet.addCell(label9);
Label label10 = new Label(10, i, listClinic.get(i).getICD_10());
sheet.addCell(label10);
Label label11 = new Label(11, i, listClinic.get(i).getDate_birth());
sheet.addCell(label11);
Label label12 = new Label(12, i, listClinic.get(i).getAge_0());
sheet.addCell(label12);
Label label13 = new Label(13, i, listClinic.get(i).getGender());
sheet.addCell(label13);
Label label14 = new Label(14, i, listClinic.get(i).getAge_1());
sheet.addCell(label14);
Label label15 = new Label(15, i, listClinic.get(i).getDate_discharge());
sheet.addCell(label15);
Label label16 = new Label(16, i, listClinic.get(i).getRegisted_address());
sheet.addCell(label16);
Label label17 = new Label(17, i, listClinic.get(i).getAdmission_cost());
sheet.addCell(label17);
Label label18 = new Label(18, i, listClinic.get(i).getAddress_present());
sheet.addCell(label18);
Label label19 = new Label(19, i, listClinic.get(i).getICD());
sheet.addCell(label19);
Label label20 = new Label(20, i, listClinic.get(i).getID());
sheet.addCell(label20);
} // 写入数据并关闭文件
book.write();
book.close();
} catch (Exception e) {
System.out.println(e);
}
} catch (Exception e) {
e.printStackTrace();
}
}

六、读取文件内容:

org.apache.commons.codec.binary.Base64

String path = tPath.substring(0,tPath.lastIndexOf("\\")) + file.getUrl();
File f = new File(path);
InputStream iStream = new FileInputStream(f);
byte[] bytes = new byte[(int)f.length()];//或new byte[iStream.available()]
iStream.read(bytes);
String content = new String(Base64.encodeBase64(bytes),"utf-8");
iStream.close();
//------------------------------------------------------------------------------ InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
InputStreamReader iReader = new InputStreamReader(inputStream); char len;
while (iReader.ready()) {
len = (char) iReader.read();
String string2 = String.valueOf(len);
ss += string2;
}
inputStream.close();
iReader.close();

 问题:

1、代码调试正常,发布war包在tomcat运行,读取html页面内容出现乱码:

原因:读取的时候,编码没有设置(修改为UTF-8读取)

例:

OutputStreamWriter bw = null;
FileOutputStream fop = null;
BufferedReader br =null;
InputStreamReader isr=null;
FileInputStream fis=null; File file = new File(filename);
fop = new FileOutputStream(file);
bw = new OutputStreamWriter(fop, "UTF-8");
..... File fileR = new File(fromPath);
fis = new FileInputStream(fileR);
isr = new InputStreamReader(fis, "UTF-8");
br = new BufferedReader(isr); String tempStr;
String len="";
while((tempStr = br.readLine()) != null)
{
  len += tempStr;
}

// 关闭输入流,释放系统资源
  iStream.close();
  iReader.close();
  br.close();

 效率较高:

InputStream inputStream = null;
BufferedInputStream input = null;
ByteArrayOutputStream outputStream = null;
try {
inputStream = ftpClient.retrieveFileStream(fileName);
input = new BufferedInputStream(inputStream);
outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len=input.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
xmlStr = new String( outputStream.toByteArray(),"GBK");
}
bufferedInputStream = new BufferedInputStream(inputStream);
byte[] bytes = new byte[inputStream.available()];
bufferedInputStream.read(bytes);
xmlStr = new String(bytes,"GBK");
int len;
while ((len = bInputStream.read(bytes)) != -1){
outputStream.write(bytes,0,len);
}

 效率较低:

String len;
while ((len = bufferedReader.readLine()) != null){
xmlStr += len;
}