我正在逐行读取文件,如下所示:
FileReader myFile = new FileReader(File file);
BufferedReader InputFile = new BufferedReader(myFile);
// Read the first line
String currentRecord = InputFile.readLine();
while(currentRecord != null) {
currentRecord = InputFile.readLine();
}
但如果上传其他类型的文件,它仍会读取其内容。例如,如果上传的文件是图像,则在读取文件时将输出垃圾字符。所以我的问题是:如何在阅读之前检查文件是否为CSV?
检查文件的扩展名有点蹩脚,因为有人可以上传非CSV但扩展名为.csv的文件。提前谢谢。
答案 0 :(得分:2)
确定文件的MIME类型并不容易,特别是如果ASCII部分可以与二进制部分混合使用。
实际上,当你看一下java邮件系统如何确定电子邮件的MIME类型时,它确实涉及读取其中的所有字节,并应用一些“规则”。
查看MimeUtility.java
- 如果此数据源的主要类型是“text”,并且如果其输入流中的所有字节都是US-ASCII,则编码为“7bit”。
- 如果超过一半的字节是非US-ASCII,则编码为“base64”。
- 如果少于一半的字节是非US-ASCII,则编码为“quoted-printable”。
- 如果此数据源的主要类型不是“text”,那么如果其输入流的所有字节都是US-ASCII,则编码为“7bit”。
- 如果甚至有一个非US-ASCII字符,则编码为“base64”。
@return
“7bit”,“quoted-printable”或“base64”
正如mmyers在删除的评论中提到的,JavaMimeType应该做同样的事情,但是:
File file = new File("/home/bibi/monfichieratester");
InputStream inputStream = new FileInputStream(file);
ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream();
int readByte;
while ((readByte = inputStream.read()) != -1) {
byteArrayStream.write(readByte);
}
String mimetype = "";
byte[] bytes = byteArrayStream.toByteArray();
MagicMatch m = Magic.getMagicMatch(bytes);
mimetype = m.getMimeType();
所以......既然你正在阅读文件的所有内容,你可以利用它来根据内容和你自己的规则来确定类型。
答案 1 :(得分:0)
Java Mime Magic可能有用。它将从文件和输入流中分析mime类型。但是,我不能保证它的功能。
This link可能会提供更多信息。它提供了几种不同的方法来确定如何做你想要的(或至少类似的东西)。
我可能会想要写一些特定于您的问题域的内容。例如确定每行的逗号分隔值的数量,如果不在某些限制范围内则拒绝。然后在逗号上拆分并根据要求解析每个条目(例如,它们是双精度/浮点数/有效字符串 - 如果是字符串,则是什么编码)。我认为你可能不得不这样做,因为有人可能上传一个像CSV一样但在中途被破坏的文件。