io使用摸索,读取文件,读取properties

最近在跟进web基础
其中学习到的
Servlet API:HttpServletRequest,HttpServletResponse,
servlet中的几个接口:ServletConfig,ServletContext,RequestDispatcher
详见https://www.cnblogs.com/Myarticles/p/8989799.html 这个博客。有相关的总结。or
https://www.cnblogs.com/xdp-gacl/p/3789624.html 孤傲苍狼的博客,每个章节都特详细

一:使用outputStream输出流 输出中文时
在服务器端,数据是以哪个码表输出的,那么就要控制客户端浏览器以相应的码表打开,比如:outputStream.write(“中国”.getBytes(“UTF-8”));使用OutputStream流向客户端浏览器输出中文,以UTF-8的编码进行输出,此时就要控制客户端浏览器以UTF-8的编码打开,否则显示的时候就会出现中文乱码,那么在服务器端如何控制客户端浏览器以以UTF-8的编码显示数据呢?可以通过设置响应头控制浏览器的行为,例如:response.setHeader(“content-type”, “text/html;charset=UTF-8”);通过设置响应头控制浏览器以UTF-8的编码显示数据。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String data = "中国";
        response.setHeader("content-type", "text/html;charset=UTF-8"); //通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码

        byte[] dataoutput = data.getBytes("UTF-8");//查的是操作系统的码表
        response.getOutputStream().write(dataoutput);//response.getOutputStream()获取OutputStream输出流
        }

运行结果如下
在这里插入图片描述
二:使用printWriter输出流输出中文时

 public void outputChineseByPrintWriter(HttpServletResponse response) throws IOException {
  String data = "中国";
        response.setContentType("text/html;charset=utf-8");// response.setContentType底层也是调用了-- HttpServletResponse#setHeader() ==>  response.setHeader("content-type", "text/html;charset=UTF-8")
        response.setCharacterEncoding("UTF-8");//第一步(顺序不能乱) 设置将字符以"UTF-8"编码输出到客户端浏览器  

        PrintWriter out = response.getWriter();//第二步(顺序不能乱) 获取PrintWriter输出流

//        out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'/>");
        out.write(data);//使用PrintWriter流向客户端输出字符
        }

读操作(输入流)

包括了
File
InputStream
FileInputStream
InputStreamReader(父类 接口是Reader ) --》编码转换桥梁
BufferedReader(父类接口是Reader) —》缓冲提高 速度

写操作(输出流)
包含
OutputStream
FileOutputStream
OutPutStreamWriter
BufferedWriter

以下贴上我测试的代码

 public void getIo() {
        File file = new File("C:\\Users\\tengfei\\Desktop\\hha.txt");
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file);
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            int  positon; // 这句代码后续会做调整
            while ((positon = bufferedReader.read())!=-1){ // 这句代码后续会做调整
                System.out.println(bufferedReader.readLine()); // 这句代码后续会做调整
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

原始文档为

front :feature/AXD-21966
cps-project:feature/AXD-21966  ————————》    feature/20190318/public_test(公共分支)
oscar-project:feature/AXD-21966  ——————————》    feature/20190318/public_test(公共分支)


身份证反面照片非空 user.imgIdentifyBackNotNull OK
身份证正面照片非空 user.imgIdentifyFrontNotNull  OK 
身份证失效时间校验  OK   
OCR认证 user.isOcr   OK  -- 必要条件,当其他ocr的规则配置时,需先将OCR认证配置好
OCR地址非空 user.ocrAddressNotNull    

当条件为
while ((positon=bufferedReader.read())!=-1){
运行结果为如下。可以发现,每行不论是英文还是中文都少了一个字符。
网上百度了下,说是bufferedReader.read()读取了一个字符,bufferedReader.readLine()就只会读取剩余的字符。

ront :feature/AXD-21966
ps-project:feature/AXD-21966  ————————》    feature/20190318/public_test(公共分支)
scar-project:feature/AXD-21966  ——————————》    feature/20190318/public_test(公共分支)


份证反面照片非空 user.imgIdentifyBackNotNull OK
份证正面照片非空 user.imgIdentifyFrontNotNull  OK 
份证失效时间校验  OK   
CR认证 user.isOcr   OK  -- 必要条件,当其他ocr的规则配置时,需先将OCR认证配置好
CR地址非空 user.ocrAddressNotNull 

当条件为
String postion;
while ((positon=bufferedReader.readLine())!=null){
运行结果为如下。可以发现,少了几行。
bufferedReader.readLine()读取了一行之后,就只会读取剩余的字符。当遇到空行时,不会进入到逻辑。
运行结果为

cps-project:feature/AXD-21966  ————————》    feature/20190318/public_test(公共分支)

身份证反面照片非空 user.imgIdentifyBackNotNull OK
身份证失效时间校验  OK   
OCR地址非空 user.ocrAddressNotNull   
 @Test
    public void getIo() {
        File file = new File("C:\\Users\\tengfei\\Desktop\\hha.txt");
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file);
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String positon = null;
            while ((positon = bufferedReader.readLine()) != null) {
                System.out.println(positon);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

读取配置文件信息

由此总结一下
Class.getResourceAsStream()与ClassLoader.getResourceAsStream()的区别
Class.getResourceAsStream(“fileName”) 默认下会指定要加载的资源路径与当前类所在包的路径一致。 当前类指的是当前代码所在的类,与class前的类名无关。比方说Properties.class.getResourceAsStream("/cfg.properties"),当前类名是FinanceWsm,cfg.properties的地址是相对于这个类的相对地址。
如果这个filename是以 ‘/’ 开头的,那么就会从classpath的根路径下(Src目录下)开始查找。

  1. Class.getResourceAsStream(String path) :
    path 不以’/‘开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath(Src根目录)根下获取。
    其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。

  2. Class.getClassLoader.getResourceAsStream(String path) :
    默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。

public class FinanceWsm{
  @org.junit.jupiter.api.Test
    public void testIo1() {
        Properties properties = null;
//        InputStream inputStream = FinanceWsm.class.getClassLoader().getResourceAsStream("cfg.properties"); -- ok
//        InputStream inputStream = Properties.class.getClassLoader().getResourceAsStream("cfg.properties"); // no
        InputStream inputStream = FinanceWsm.class.getClassLoader().getResourceAsStream("/cfg.properties"); // no
//        InputStream inputStream = FinanceWsm.class.getResourceAsStream("/cfg.properties"); // ok
//        InputStream inputStream = Properties.class.getResourceAsStream("/cfg.properties"); // ok
//        InputStream inputStream = Properties.class.getResourceAsStream("cfg.properties"); // no  这个是为啥会有空指针呢?
        properties = new Properties();
        try {
            properties.load(inputStream);
        } catch (IOException e) {
            log.error(e.toString());
        } finally {

        }
        System.out.println(properties.getProperty("test3XmlPath"));
    }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值