`

JAVA--IO--乱码

 
阅读更多

一、

IO的乱码往往出现字符流中,可在字节流向字符流转换的时候处理,如:

new InputStreamReader(new FileInputStream(file),"UTF-8")

二、

或者直接使用字节流

new String(sb.toString().getBytes("ISO-8859-1"), "UTF-8")//注:sb是字节流的简单拼装

 

 

在字节转向字符流时,如果不指定则默认取自入口函数所在的JAVA文件的编码值。分析如下:

//在创建时可以指定字符集
public InputStreamReader(InputStream in, String charsetName){
sd = StreamDecoder.forInputStreamReader(in, this, charsetName);
}
//如果没有指定则获取默认值
public static StreamDecoder forInputStreamReader(InputStream inputstream, Object obj, String s){
        String s1 = s;
        if(s1 == null)
            s1 = Converters.getDefaultEncodingName();
        if(!Converters.isCached(0, s1))
           。。。    
}
//默认值来自System.getProperty
public static String getDefaultEncodingName(){
GetPropertyAction getpropertyaction = new GetPropertyAction("file.encoding");//这里取自System.getProperty(变量)
        return defaultEncoding;
    }

 

 System.getProperty值的来源:首先并不是操作系统os的默认编码

 

问题1:file.encoding的值是什么呢?  这个一开始我认为是操作系统的编码

但我错了,它的值为保存每个程序的main入口的那个java文件的保存编码(点击文件-->属性-->text file encoding(other的值),这是使用eclipse 编译器)

通过以下的代码即可证明:

/**
 * Test.java源代码文件
 */
public class Test { 
    public static void main(String[] args) { 
        System.out.println(System.getProperty("file.encoding")); 
        //Test2.printEncoding();
    } 
}

 

1、文件保存的编码为:GB2312 时

编译执行之后,得到的结果为:

GB2312

2、文件保存的编码为:GBK 时

编译执行之后,得到的结果为:

GBK

3、文件保存的编码为:UTF-8时

编译执行之后,得到的结果为:

UTF-8

从上面的三个结果可以看出,file.encoding的值并不是操作系统os的默认编码

而是main入口函数所在的类的保存编码.

但是这时想到了另一个问题,

问题2:是不是每个java文件都有自己的file.encoding呢?

于是我写了另一个类做试验,添加了类文件Test2.java

/**
 * Test2.java源代码文件
 */
public class Test2 {
    public static void printEncoding(){
        System.out.println(System.getProperty("file.encoding"));
    }
}

 

并将源文件Test.java的代码修改为:

/**
 * Test.java源代码文件
 */
public class Test { 
    public static void main(String[] args) { 
        System.out.println(System.getProperty("file.encoding")); 
        Test2.printEncoding();//添加了这个命令
    } 
}

 

这时我将Test.java的保存编码设置为:utf-8

将Test2.java的保存编码设置为:GBK

根据问题2我最原始的假设那么

编译运行这两个文件之后得到的结果应该为:

utf-8
GBK

  

但事实是运行后的结果为:

utf-8
utf-8

于是得出了结论是:

在一个运行的应用程序中

file.encoding的值只有一个,并且值为入口函数的保存编码的值

分享到:
评论

相关推荐

    第-章-JAVA-IO优秀文档.pptx

    Java IO(Input/Output)是Java编程语言中用于处理输入输出操作的重要部分,它提供了丰富的类库来处理各种类型的输入输出需求。在本章中,我们将深入探讨Java IO中的File类以及相关的概念和技术。 首先,File类是...

    JAVA-IO详解.txt

    ### JAVA-IO详解 #### 一、概述与基础概念 在Java编程语言中,输入输出(简称IO)处理是程序开发中的一个基本且重要的部分。Java IO系统主要由两大类构成:字节流(Byte Stream)和字符流(Character Stream)。这...

    Java-filter过滤器在项目开发中的应用.docx

    import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest...

    commons-fileupload-1.2.2+commons-io-2.4+源码+帮助文档

    使用`setFileSizeMax()`和`setHeaderEncoding()`方法设置大小限制,避免乱码问题。 5. **文件处理**:对于大文件,FileUpload支持写入磁盘,通过`DiskFileItemFactory`进行配置。上传的文件可以被移动、重命名或...

    java-IO操作-(读写、追加、删除、移动、复制、修改).doc

    java IO 操作(读写、追加、删除、移动、复制、修改) java IO 操作是 Java 语言中对文件、流、输入/输出操作的统称。下面是 java IO 操作的详细知识点: 一、 java IO 操作的分类 java IO 操作可以分为两大类:...

    java-IO流学习使用教程

    Java IO流是Java平台中处理输入输出操作的重要组成部分,它允许程序与外部设备(如硬盘、网络、内存等)进行数据传输。Java IO流分为两大类:字节流(Byte Stream)和字符流(Character Stream)。本文将详细介绍...

    java中文乱码解决问题

    public String toGBK(String str) throws java.io.UnsupportedEncodingException{ return new String(str.getBytes("ISO-8859-1"),"GBK"); } 3. 在数据库中存储和读取中文数据 对于大多数数据库的 JDBC 驱动程序...

    Java解决UTF-8的BOM问题

    它们是`java.io`包的一部分,提供了对带有BOM的文件进行读取的功能。`UnicodeInputStream`是一个过滤输入流,它的主要任务是检测并移除文件头中的BOM标志。`UnicodeReader`则是在`BufferedReader`基础上扩展的,用于...

    JAVA IO-NIO 详解

    ### JAVA IO-NIO 详解 #### 一、IO与NIO概述 在Java开发中,输入/输出(IO)操作是程序与外部环境交互的重要环节。通过IO操作,程序可以读取外部数据或向外部环境输出数据。Java的IO体系自Java 1.0以来就一直存在...

    乱码 编码方式解决 gbk ISO8859-1 utf8 编码

    ### 乱码问题与编码方式解决方案 在计算机科学与信息技术领域中,字符编码是一个至关重要的概念,它直接关系到文本数据的正确存储、传输与显示。本文将针对标题中的几种常见编码格式(GBK、ISO 8859-1、UTF-8)以及...

    java-编写跨平台Java程序注意事项

    - 例如,使用`java.io.File.separator`获取当前平台的路径分隔符,或者使用`java.nio.file.Paths.get(path).toString()`来获取规范化路径。 #### 9. 获取主机名和IP地址 - 获取主机名时,应使用`java.net....

    java-study.zip_java_winterh82

    如果这是一个Java项目,它可能涉及到更多的编程概念,如面向对象设计、异常处理、集合框架、IO流、多线程、网络编程等。 总之,这个压缩包提供了关于Java编程和字符编码的知识点,对于想要深入理解Java以及跨文化...

    java压缩zip文件解决中文乱码问题

    import java.io.*; import java.util.zip.*; public class CompressUtil { public static void zipFiles(String[] fileNames, String targetZipFile) { try (FileOutputStream fos = new FileOutputStream...

    java Socket与C#通信中中文乱码问题的解决方案

    在Java和C#之间进行Socket通信时,遇到中文乱码问题主要是由于编码格式不一致导致的。Java默认使用UTF-8编码,而C#在处理字符串时可能使用其他编码,如GBK或ASCII。为了解决这个问题,我们需要确保两端在发送和接收...

    java zip压缩解压工具解决中文乱码问题

    以上代码片段展示了如何利用Apache Commons IO库来处理中文乱码问题,使得在Java中进行ZIP文件的压缩和解压更加便捷和准确。在实际开发中,根据项目需求,可以选择使用标准库或者Apache Commons IO库,确保文件名和...

    解决Linux操作系统下Java的中文乱码问题

    3. **输入输出流编码**:Java的IO操作如读写文件,需明确指定编码。例如,使用`FileReader`和`FileWriter`时,可以传递一个`Charset`对象来指定编码。 4. **网络数据编码**:HTTP请求或响应的编码也需注意,可通过`...

    Java开发Client客户端,连接Windows的Telnet服务器,解决了中文乱码问题

    import java.io.*; import java.net.*; public class JavaTelnetClient { public static void main(String[] args) throws IOException { Socket socket = new Socket("服务器IP", 23); // 连接到服务器的23端口...

    java操作串口linux环境下Java_gnu_io_RXTXPort_nativeDrain报错解决方案

    java控制串口发送数据时在windows环境下正常,linux环境下报错C [librxtxSerial.so+0x75da] Java_gnu_io_RXTXPort_nativeDrain+0xea,经多方查询验证为rxtx包版本问题,用本文档中的版本可以正常运行

    java解决压缩中文乱码

    import java.io.*; import java.util.zip.*; public class UTF8ZipOutputStream extends ZipOutputStream { public UTF8ZipOutputStream(OutputStream out) throws IOException { super(out); } @Override ...

    Java-the application of TCPIP

    Java的IO流库支持对数据的读写操作,包括字节流和字符流。流可以连接到各种数据源,如文件、网络连接和内存缓冲区。管理流如BufferedReader和BufferedWriter可以提高性能,通过缓冲区一次性处理大量数据。...

Global site tag (gtag.js) - Google Analytics