最近在跟进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目录下)开始查找。
-
Class.getResourceAsStream(String path) :
path 不以’/‘开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath(Src根目录)根下获取。
其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。 -
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"));
}
}