IO流读取文件乱码,为什么?

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@ page import="java.io.*"%>
<%@ page import="org.apache.struts2.ServletActionContext"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">


/s:param
/s:fielderror<!-- 为什么这个存在时直接访问此界面时就不会报错,否则报错 -->
<% //request.setCharacterEncoding("UTF-8") ;
    String realpath = ServletActionContext.getServletContext()  
            .getRealPath("/upload");
     try {   
            // 创建文件输入流对象   
            FileInputStream is = new FileInputStream(realpath+"\\"+"nihao.doc");   
            // 设定读取的字节数   
            int n = 512;   
            byte buffer[] = new byte[n];   
            // 读取输入流   
            while (is.read(buffer, 0, n) >0) { 
                String str = new String(buffer);  
                out.print(str);  
                out.print("<br>"); 
            }   
            // 关闭输入流   
            is.close();   
            } catch (IOException ioe) {   
            System.out.println(ioe);   
            } catch (Exception e) {   
            System.out.println(e);   
            }
 %>


构建源 构建目标 输入输出流实现传输

主要思想:1,构建源;2构建目标;3,用输入输出流来实现传输;
字节输入、输出流:InputStream / OutputStream,字符输入、输出流Reader/Writer;
注:一般文本数据用字符流,其他格式数据用字节流;
InputStreamReader把一个InputStream转化成一个Reader;
BufferedReader通常和PrintWriter配合使用;
字......
答案就在这里:【insigma】IO流(文件读取)
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

构建源 构建目标 输入输出流实现传输

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> 这里是 GB2312 看一下源文件是什么编码,如果编码不同就在读写的时候重新设置编码

// 创建文件输入流对象

FileInputStream is = new FileInputStream(realpath+"\"+"nihao.doc");

应该是这里出错了,比如你这个文件 是用UTF-8编码的。
然后你将这些字节转换成字符时,你没有指定解码的格式,一般是使用ISO.所以你读的时候要指定下解码的格式

FileInputStream is = new FileInputStream(realpath+"\"+"nihao.doc");

InputStreamRead read=new InputStreamRead(is,"UTF-8")//这里可以设置不同的解码方式

  // 设定读取的字节数   
        int n = 512;   
        byte buffer[] = new byte[n];   
        // 读取输入流   
        while (read.read(buffer, 0, n) >0) { 
            String str = new String(buffer);  
            out.print(str);  
            out.print("<br>"); 
        }   

使用InputStreamRead read=new InputStreamRead(is,"UTF-8")//这里可以设置不同的解码方式。
然后再从read里来读

没有设置编码,设置编码试试

<% 这里面的是java代码%>这个你可以debug调试下看看是什么错误