Java 使用FileInputStream执行多个操作

Java 使用FileInputStream执行多个操作,java,fileinputstream,Java,Fileinputstream,我有一个Java类来读取文件并将一些数据设置为类。我有一节课 FileMetadata.java public class FileMetadata implements Serializable { private String location; private Double size; private String content; private List<String> lines; private String md5Digest

我有一个Java类来读取文件并将一些数据设置为类。我有一节课

FileMetadata.java

public class FileMetadata implements Serializable {

    private String location;
    private Double size;
    private String content;
    private List<String> lines;
    private String md5Digest;

    //parameterized constructor
    //getters and setters
}
public static void readFile(File file) throws IOException {
    FileInputStream fis = null;
    List<String> fileLines = new ArrayList<String>();
    try {
        fis = new FileInputStream(file);
        StringBuilder sb = new StringBuilder();
        StringBuilder sbLine = new StringBuilder();
        int ch;
        while ((ch = fis.read()) != -1) {
            String line = "" + (char) ch;
            sb.append(line);
            if(line.matches("(\r|\n)")) {
                fileLines.add(sbLine.toString());
                sbLine.setLength(0);
            } else {
                sbLine.append(line);
            }
        }
        String md5 = DigestUtils.md5Hex(fis);
        System.out.println(md5);
        System.out.println(sb.toString());
        System.out.println(getFileSizeInKB(file));
        for(String str : fileLines) {
            System.out.println(str);
        }
    } finally {
        if (fis != null) {
            fis.close();
        }
    }
}
公共类FileMetadata实现可序列化{
私有字符串位置;
私人双户型;
私有字符串内容;
私有列表行;
私有字符串md5Digest;
//参数化构造函数
//接球手和接球手
}
读取文件后,我想设置这个类中的值

这是我读取文件的方法

FileUtil.java

public class FileMetadata implements Serializable {

    private String location;
    private Double size;
    private String content;
    private List<String> lines;
    private String md5Digest;

    //parameterized constructor
    //getters and setters
}
public static void readFile(File file) throws IOException {
    FileInputStream fis = null;
    List<String> fileLines = new ArrayList<String>();
    try {
        fis = new FileInputStream(file);
        StringBuilder sb = new StringBuilder();
        StringBuilder sbLine = new StringBuilder();
        int ch;
        while ((ch = fis.read()) != -1) {
            String line = "" + (char) ch;
            sb.append(line);
            if(line.matches("(\r|\n)")) {
                fileLines.add(sbLine.toString());
                sbLine.setLength(0);
            } else {
                sbLine.append(line);
            }
        }
        String md5 = DigestUtils.md5Hex(fis);
        System.out.println(md5);
        System.out.println(sb.toString());
        System.out.println(getFileSizeInKB(file));
        for(String str : fileLines) {
            System.out.println(str);
        }
    } finally {
        if (fis != null) {
            fis.close();
        }
    }
}
publicstaticvoidreadfile(文件文件)引发IOException{
FileInputStream fis=null;
List fileLines=new ArrayList();
试一试{
fis=新文件输入流(文件);
StringBuilder sb=新的StringBuilder();
StringBuilder sbLine=新的StringBuilder();
int-ch;
而((ch=fis.read())!=-1){
字符串行=”+(字符)ch;
某人附加(行);
if(line.matches(“(\r |\n)”)){
add(sbLine.toString());
sbLine.setLength(0);
}否则{
sbLine.append(行);
}
}
字符串md5=DigestUtils.md5Hex(fis);
系统输出打印项次(md5);
System.out.println(sb.toString());
System.out.println(getFileSizeInKB(file));
for(字符串str:fileLines){
系统输出打印项次(str);
}
}最后{
如果(fis!=null){
fis.close();
}
}
}
但是列表显示不正确,因为它在每行后面添加了一个空字符串,因为下一行的文件是“\r\n”。第二次添加空StringBuilder时,列表将在每行之后获得额外的空字符串。
我可以在添加到列表之前检查它的长度。但是如果文件包含空行,我想添加到列表中。

您可以尝试使用
BufferedReader

BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line=br.readLine())!=null) {
 ..............
}
br.close();
FileInputStream fis = new FileInputStream(file);
String md5 = DigestUtils.md5Hex(fis);
fis.close();

(示例中没有异常处理)。

但是获取文件MD5怎么样?它需要InputStreamHi,您可以在读取文件后创建另一个流。我会用它更新答案。一般来说,重用流是不安全的。为新操作创建新的输入流。