1.在线OJ-背景介绍
在线的网页版的编程平台.,打开一个网站,上面就能看到很多的算法题.,在线做题,在线提交.立即就能看到运行结果,是否通过.
leetcode 牛客等
一个在线OJ平台,核心功能:
- 能够管理题目(保存很多的题目信息:题干+测试用例)
- 题目列表页:能够展示题目列表
- 题目详情页:能够展示某个题的详细信息+代码编辑框~
- 提交并运行题目:详情页中有一个"提交”按钮.点击按钮网页就会把当前的代码给提交到服务器上.服务器就会执行代码,并且就会给出一些是否通过用例的结果
- 查看运行结果:有另外一个结果页面,能展示上次提交的是否通过,以及错误的用例信息~这里也会提供一些历史提交记录就更好了~
2.项目效果演示
3.创建项目(项目配置)
4.IO流对象
IO流操作文件的代码.在Java 中,操作文件(读写)通过IO流相关的类来实现的Java标准库中,对于IO的操作提供了很多现成的类.这些类放在java.io这个包里~:标准库中的这些类,大概可以分成两大类~
- —大类是操作字节的(以字节为单位进行读写的)
- —大类是操作字符的(以字符为单位进行读写的)
字节8个bit位.(表示存储空间的基本单位了)字符表示一个"文字符号",一个字符可能是由多个字节构成的.因此就需要根据文件类型,来决定是按照字节操作还是字符操作.有的文件是二进制文件(这种就需要按照字节来操作)有的文件是文本文件(这种就需要按照字符来操作)怎么去区分一个文件是文本,还是二进制呢?(简单的办法,使用记事本打开,看看是不是乱码.如果是乱码,二进制文件.如果不乱码,就是文本文件)因为记事本是默认按照文本的方式来打开解析文件的.
- 针对字节为单位进行读写的类,统称为“字节流"字节流: InputStream, FilelnputStream, OutputStream, FileOutputStream
- 针对字符为单位进行读写的类,统称为“字符流"字符流: Reader,FileReader, Writer,FileWriter
5.读写文件简单示例
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestFile {
public static void main(String[] args) throws IOException {
String srcPath = "C:\\Users\\Administrator\\Desktop\\project_test\\online_oj_servlet\\test1.txt";
String destPath = "C:\\Users\\Administrator\\Desktop\\project_test\\online_oj_servlet\\test2.txt";
FileInputStream fileInputStream = new FileInputStream(srcPath);
FileOutputStream fileOutputStream = new FileOutputStream(destPath);
while (true) {
int ch = fileInputStream.read();
if(ch == -1){
break;
}
fileOutputStream.write(ch);
}
fileInputStream.close();
fileOutputStream.close();
}
}
当在main方法上加上IOException的声明的时候, FileNotFoundException就不见了~因为FileNotFoundException 也是一种IOException (is-a,FileNotFoundException就是IOException的子类)使用throws lOException,就能涵盖FileNotFoundException .一个进程能够同时打开的文件个数是存在上限的!!(受限于操作系统内核里面的实现.对Linux.来说,进程PCB中存在一个属性,文件描述符表.大小是存在上限的)Linux中可以通过ulimit命令来查看/修改进程能够支持的最大文件个数.)
6.进程和线程
进程也可以称为是"任务",操作系统要想执行一个具体的"动作"就需要创建出一个对应的进程.一个程序没有运行的时候,仅仅是一个"可执行文件"一个程序跑起来了,就变成一个进程了。为了实现"并发编程"(同时执行多个任务)就引入了"多进程编程",把一个很大的任务,拆分成若干个很小的任务,创建多个进程,每个进程分别负责其中的一部分任务也带来一个问题:创建/销毁进程,比较重量(比较低效),就又引入了线程~每个线程都是一个独立的执行流.一个进程包含了一个或者多个线程~创建线程/销毁线程比创建进程/销毁进程更高效.因此, Java圈子里,大部分的并发编程都是通过多线程的方式来实现的~~进程相比于线程的优势:进程的"独立性"操作系统上,同一时刻运行着很多个进程~
如果某个进程挂了,不会影响到其他进程. (每个进程有各自的地址空间)相比之下,由于多个线程之间,共用着同一个进程的地址空间,某个线程挂了,就很可能会把整个进程带走.
在线OJ:
有一个服务器进程.(运行着Servlet,接收用户的请求,返回响应...)用户提交的代码,其实也是一个独立的逻辑~这个逻辑是使用多线程执行好,还是多进程呢?对于这里用户提交的代码,一定是要通过"多进程"的方式来执行的!!!因为我们无法控制用户到底提交了啥代码!!!代码很可能是存在问题的,很可能一运行就崩溃的!!如果使用多线程,就会导致用户代码直接把整个服务器进程都给带走了的糟糕情况~
7.java多进程编程(1)-进程创建
Java中进行多进程编程.多进程编程主要要做的事情:站在操作系统的角度(以Linux为例)提供了很多的和多进程编程相关的接口.进程创建,进程终止,进程等待,进程程序替换,进程间通信.....(C++方向要学习的内容)谈到多进程,经常会涉及到"父进程,子进程"但是对于多线程,就没有"父线程,子线程"这种说法.
而在Java中对系统提供的这些操作进行了限制,最终给用户只提供了两个操作
- 进程创建:创建出一个新的进程.让这个新的进程来执行一系列的任务.~被创建出来的进程,称为"子进程",创建子进程的进程,称为“父进程"咱们的服务器进程,就相当于父进程.根据收到的用户发送过来的代码,再创建出子进程.一个父进程,可以有多个子进程.但是一个子进程,只能有一个父进程.
- 进程等待.
8.java多进程编程(2)-环境变量
装jdk的时候,因该配置好了.出不来以下界面,配置一下jdk的环境变量
9.java多进程编程(3)-获取标准输出和标准错误
一个进程在启动的时候,就会自动打开三个文件:
- 标准输入对应到键盘.
- 标准输出对应到显示器.
- 标准错误对应到显示器.
虽然子进程启动后同样也打开了这三个文件,但是由于子进程没有和IDEA的终端关联.因此在IDEA中是看不到子进程的输出的.要想获取到输出,就需要在代码中手动获取到.~