当前位置: 首页 > 面试题库 >

如何使用Java将汉字保存到文件中?

卫寒
2023-03-14
问题内容

我使用以下代码将汉字保存到.txt文件中,但是当我用写字板打开它时,我看不懂它。

StringBuffer Shanghai_StrBuf = new StringBuffer("\u4E0A\u6D77");
boolean Append = true;

FileOutputStream fos;
fos = new FileOutputStream(FileName, Append);
for (int i = 0;i < Shanghai_StrBuf.length(); i++) {
    fos.write(Shanghai_StrBuf.charAt(i));
}
fos.close();

我能做什么 ?我知道如果将汉字剪切并粘贴到写字板中,可以将其保存到.txt文件中。如何在Java中做到这一点?


问题答案:

这里有几个因素在起作用:

  • 文本文件没有用于描述其编码的内在元数据(就尖括号税而言,XML受欢迎是有原因的)
  • Windows的默认编码仍然是8位(或双字节)“ ANSI ”字符集,其值范围有限-以这种格式编写的文本文件不可移植
  • 为了从ANSI文件中识别出Unicode文件,Windows应用程序依赖文件开头的字节顺序标记(严格意义上不是这样-Raymond Chen解释)。理论上,BOM可以告诉您数据的字节序(字节顺序)。对于UTF-8,即使只有一个字节顺序,Windows应用程序也依靠标记字节来自动确定它是Unicode(尽管您会注意到Notepad在其打开/保存对话框中有一个编码选项)。
  • 说Java损坏是错误的,因为Java不会自动编写UTF-8 BOM。例如,在Unix系统上,将BOM表写入脚本文件将是错误的,并且许多Unix系统使用UTF-8作为其默认编码。有时候,您也不希望在Windows上使用它,例如将数据追加到现有文件中时:fos = new FileOutputStream(FileName,Append);

这是一种将UTF-8数据可靠地附加到文件的方法:

  private static void writeUtf8ToFile(File file, boolean append, String data)
      throws IOException {
    boolean skipBOM = append && file.isFile() && (file.length() > 0);
    Closer res = new Closer();
    try {
      OutputStream out = res.using(new FileOutputStream(file, append));
      Writer writer = res.using(new OutputStreamWriter(out, Charset
          .forName("UTF-8")));
      if (!skipBOM) {
        writer.write('\uFEFF');
      }
      writer.write(data);
    } finally {
      res.close();
    }
  }

用法:

  public static void main(String[] args) throws IOException {
    String chinese = "\u4E0A\u6D77";
    boolean append = true;
    writeUtf8ToFile(new File("chinese.txt"), append, chinese);
  }

注意:如果文件已经存在,并且您选择追加并且现有数据 不是 UTF-8编码的,那么代码将创建的唯一内容就是一团糟。

这是Closer此代码中使用的类型:

public class Closer implements Closeable {
  private Closeable closeable;

  public <T extends Closeable> T using(T t) {
    closeable = t;
    return t;
  }

  @Override public void close() throws IOException {
    if (closeable != null) {
      closeable.close();
    }
  }
}

此代码使Windows最佳地猜测如何基于字节顺序标记读取文件:

  private static final Charset[] UTF_ENCODINGS = { Charset.forName("UTF-8"),
      Charset.forName("UTF-16LE"), Charset.forName("UTF-16BE") };

  private static Charset getEncoding(InputStream in) throws IOException {
    charsetLoop: for (Charset encodings : UTF_ENCODINGS) {
      byte[] bom = "\uFEFF".getBytes(encodings);
      in.mark(bom.length);
      for (byte b : bom) {
        if ((0xFF & b) != in.read()) {
          in.reset();
          continue charsetLoop;
        }
      }
      return encodings;
    }
    return Charset.defaultCharset();
  }

  private static String readText(File file) throws IOException {
    Closer res = new Closer();
    try {
      InputStream in = res.using(new FileInputStream(file));
      InputStream bin = res.using(new BufferedInputStream(in));
      Reader reader = res.using(new InputStreamReader(bin, getEncoding(bin)));
      StringBuilder out = new StringBuilder();
      for (int ch = reader.read(); ch != -1; ch = reader.read())
        out.append((char) ch);
      return out.toString();
    } finally {
      res.close();
    }
  }

用法:

  public static void main(String[] args) throws IOException {
    System.out.println(readText(new File("chinese.txt")));
  }

(System.out使用默认编码,因此是否打印任何有意义的内容取决于您的平台和配置。)



 类似资料:
  • 问题内容: 在Java中,我来自一个名为“ text”的String变量中的文本字段中的文本。 如何将“文本”变量的内容保存到文件中? 问题答案: 如果你只是输出文本,而不是任何二进制数据,则可以执行以下操作: 然后,将String写入其中,就像写入任何输出流一样: 与以往一样,你将需要异常处理。完成写作后,请务必致电。 如果你使用的是Java 7或更高版本,则可以使用“ 语句 ”,该语句将Pri

  • 以及如何将指令保存为相同格式的文本文件?

  • 我正在尝试使用javascript(前端)和Java(后端)在服务器磁盘上保存一个文件。 JavaScript: 在javascript中,我有一个函数将文件分块并通过Ajax发送给Java。 null null 这是我第一次在Java编程,所以如果你有什么建议,请告诉我。 我试图在Java中创建一个函数,将ajax发送的块保存在TXT中。当javascript检测到最后一个块时,我想用Java将

  • 问题内容: 我正在尝试使用适用于AWS的新boto3客户端做一个“ hello world” 。 我的用例非常简单:从S3获取对象并将其保存到文件中。 在boto 2.XI中,它应该是这样的: 在boto 3中。我找不到一种干净的方法来做同样的事情,所以我手动遍历了“ Streaming”对象: 要么 而且效果很好。我想知道是否有任何“本机” boto3函数可以完成相同的任务? 问题答案: Bot

  • 我正在尝试为AWS的新boto3客户端做一个“hello world”。 我的用例相当简单:从S3获取对象并将其保存到文件中。 在boto 2.X中,我会这样做: 在博托3。我找不到一种干净的方法来做同样的事情,所以我手动迭代“流”对象: 或 而且效果很好。我想知道是否有任何“本机”boto3函数可以完成相同的任务?

  • 问题内容: 我想将HtmlUnit cookie保存到一个文件,然后在下一次运行时从该文件中加载它们。我怎样才能做到这一点?谢谢。 问题答案: