我正在逐行读取文件,如下所示:
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 的文件。提前致谢。
确定文件的 MIME 类型并不容易,特别是当 ASCII 部分可以与二进制部分混合时。
实际上,当您查看 java 邮件系统如何确定电子邮件的 MIME 类型时,它确实涉及读取其中的所有字节,并应用一些“规则”。
查看MimeUtility.java http://www.koders.com/java/fid774CF829BA2AAE26A665A81A801000FB0AB8F9B4.aspx?s=isBinary+isascii#L73
- 如果此数据源的主要类型是“文本”并且其输入流中的所有字节都是 US-ASCII,则编码为“7 位”。
- 如果超过一半的字节是非 US-ASCII,则编码为“base64”。
- 如果少于一半的字节是非 US-ASCII,则编码是“quoted-printable”。
- 如果该数据源的主要类型不是“text”,那么如果其输入流的所有字节都是US-ASCII,则编码为“7bit”。
- 即使有一个非 US-ASCII 字符,编码也是“base64”。
@return
“7bit”、“引用打印”或“base64”
正如所提到的mmyers https://stackoverflow.com/users/13531/mmyers在一条被删除的评论中,JavaMime类型 http://jmimemagic.sourceforge.net/index.html应该做同样的事情,但是:
- 自2006年以来它就死了
- 它确实涉及阅读所有内容!
:
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();
所以...既然您正在阅读文件的所有内容,您可以利用它来根据该内容和您自己的规则来确定类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)