Java复制整个文件而不使用双引号

时间:2014-09-30 08:47:51

标签: java inputstream outputstream

我有一种方法可以使用缓冲区将整个文件从一个目标复制到另一个目标:

InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dest);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
   out.write(buf, 0, len);
}

in.close();
out.close();

该文件采用csv格式:

"2280B_TJ1400_001","TJ1400_Type-7SR","192.168.50.76","Aries SDH","6.0","192.168.0.254",24,"2280B Cyberjaya","Mahadzir Ibrahim"

但是你可以看到里面有引号。是否可以根据我的现有代码删除它们

输出应该是这样的:

2280B_TJ1400_001,TJ1400_Type-7SR,192.168.50.76,Aries SDH,6.0,192.168.0.254,24,2280B Cyberjaya,Mahadzir Ibrahim

4 个答案:

答案 0 :(得分:3)

如果您使用BufferedReader,则可以使用readLine()功能将文件内容作为String读取。然后,您可以使用String上的常规函数​​在将其写入输出之前对其进行操作。通过使用OutputStreamWriter,您可以直接编写字符串。

上述优势在于您无需为原始字节而烦恼,这使您的代码更易于阅读,并且在特殊情况下不易出错。

BufferedReader in = new BufferedReader(new  InputStreamReader(new FileInputStream(src)));
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(dest));
String line;
while ((line = in.readLine()) != null) {
   String stringOut = line.replaceAll("\"", "");
   out.write(stringOut);
}

in.close();
out.close();

请注意,这会删除所有"字符,而不仅仅是每个字符串的开头和结尾处的字符。为此,您可以使用StringTokenizer或更复杂的替换。

答案 1 :(得分:0)

不确定这是不是一个好主意,但你可以这样做:

 while ((len = in.read(buf)) > 0) {
     String temp = new String(buf);
     temp = temp.replaceAll("\"","");
     buf = temp.getBytes();
     len = temp.length();
  out.write(buf, 0, len);
 }

答案 2 :(得分:0)

对我来说,我会在字符串中读取所有文件,然后删除' " '在字符串中。然后将其写入dest文件。

以字符串形式读取文件

我发现了simple solution。这可能不是最好的,具体取决于您所需要的错误级别。但它足够工作;)

String content = new Scanner(new File("filename")).useDelimiter("\\Z").next();

剥离' " '

content = content.replaceAll('"', "");

将其写入here

的目标文件
Files.write(Paths.get("./duke.txt"), msg.getBytes());

这适用于java 7+。 没有测试它,但它应该工作!

答案 3 :(得分:0)

不一定是好的样式,在二进制数据中过滤引号,但非常可靠。

用您自己的InputStream包装原始InputStream,过滤掉双引号。

我添加了一个怪癖:在MS Excel中,引用字段可能包含引号,然后自动转义,表示为两个双引号。

InputStream in = new UnquotingInputStream(new FileInputStream(src));

/**
 * Removes ASCII double quote from an InputStream.
 * Two consequtive quotes stand for one quote: self-escaping like used
 * by MS Excel.
 */
public class UnquotingInputStream extends InputStream {

    private final InputStream in;
    private boolean justHadAQuote;

    public UnquotingInputStream(InputStream in) {
        this.in = in;
    }

    @Override
    public int read() throws IOException {
        int c = in.read();
        if (c == '\"') {
            if (!justHadAQuote) {
                justHadAQuote = true;
                return read(); // Skip quote
            }
        }
        justHadAQuote = false;
        return c;
    }

}

适用于使用ASCII作为子集的所有编码。所以不是:UTF-16或EBCDIC。