【问题标题】:Java copy entire file without the double quotesJava复制整个文件没有双引号
【发布时间】:2014-09-30 08:47:51
【问题描述】:

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

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

【问题讨论】:

  • 它使用我认为需要 opencsv 的 csvreader。如果我错了,请纠正我,但该库在 jdk 1.6(部署我的 exe jar)中不起作用,这就是我使用缓冲区的原因。 :)

标签: java inputstream outputstream


【解决方案1】:

如果您使用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,或更复杂的替换。

【讨论】:

  • 它起作用了,我为任何错误异常添加了尝试和捕获。谢谢
【解决方案2】:

不确定这是否是个好主意,但您可以执行以下操作:

 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);
 }

【讨论】:

  • 此解决方案不考虑字符编码,可能会导致Exceptions 和/或不需要的结果。
  • @icza :是的,我明白,但想不出更好的解决方案。
  • 更好的解决方案是使用Reader 而不是InputStream,它可以正确地将字节转换为字符。
  • @icza : 我不想改变 OP 的当前实现。
  • 试过了,但是当有 2 个双引号时它会停止复制。 “”。猜猜我没有注意到那些空字段。谢谢你的回答...
【解决方案3】:

对我来说,我会在一个字符串中读取所有文件,然后将字符串中的'"'去掉。然后将其写入目标文件。

以字符串形式读取文件

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

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

去掉'"'

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

here写到dest文件

Files.write(Paths.get("./duke.txt"), msg.getBytes());

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

【讨论】:

    【解决方案4】:

    风格不一定好,过滤二进制数据中的引号,但很扎实。

    用你自己的 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。

    【讨论】:

      猜你喜欢
      • 2013-07-02
      • 1970-01-01
      • 2018-06-19
      • 2014-11-13
      • 2021-05-22
      • 2019-03-27
      • 2014-05-13
      • 2011-06-19
      • 2019-09-15
      相关资源
      最近更新 更多