小工具      在线工具  汉语词典  css  js  c++  java

Java基础

Java,java,java-ee 额外说明

收录于:152天前

Java简介

Java是一种编程语言,也是一种高级语言。 Java针对不同的开发市场分为三种技术平台:JavaSE、JavaEE、JavaME。

JavaSE(Java Platform Standard Edition):标准版,是为开发普通桌面应用的解决方案,JavaEE和JavaME都由此发展而来,包括了Java的核心库,如数据类型,集合,数据库连接和网络编程等。

JavaEE(Java Platform Enterprise Eidtion):企业版,是为开发企业级应用的解决方案,包括Servlet,JSP,JavaBean,JDBC,EJB,WebService等技术。

JavaME(Java Platform Micro Edition):小型版,是为开发电子消费产品和嵌入式设备的解决方案。JavaME主要用于小型数字电子设备上的应用程序的开发,为家电增加智能化控制和网络功能,为手机增加新游戏和通讯录管理功能。JavaME提供了HTTP等高级Internet协议,使移动电话能以Client和Server的方式直接访问Internet的全部信息,提供高效的无线交流。

Java语言特点

    引用和指针的区别
  1. Java语言是面向对象的:它继承了封装性和多态性的特点。 Java语言提供了类、接口和继承等面向对象的特性,支持类之间的单继承,支持接口之间的多重继承,支持类与接口之间的实现机制。
  2. Java语言是分布式的:Java语言支持互联网应用程序的开发。在基本的Java应用程序编程接口中,有一个网络应用程序编程接口(java net),它为网络应用程序编程提供了类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制是也是开发分布式应用的重要手段。
  3. Java语言是跨平台的:它在Java平台上被编译成体系结构中立的字节码格式(带有类后缀的文件),然后可以在任何实现这个Java平台的系统上运行。
  4. Java语言支持多线程:Java语言支持多个线程同时执行,并提供了多个线程之间的同步机制,以提高程序运行效率。

JDK

JDK(Java Development Kit)是一套Java开发环境,包括Java编辑器、Java运行工具、Java文档生成工具、Java打包工具等。JDK环境用于Java参考程序的开发。

JRE(java Runtime Environment)是Java运行时环境,用于运行Java代码。非开发人员只需下载JRE即可运行Java应用程序。

开发Java应用程序需要需要安装JDK环境,官方下载JDK,安装并配置环境变量,doc命令输入:java -version和javac -version出现版本号即为安装成功。

在这里插入图片描述
JDK目录介绍:
在这里插入图片描述
在这里插入图片描述
bin目录:存放java可执行程序,如java.exe(运行工具)、javac.exe(java编辑器),jar.exe(打包工具,将java程序生成可重复应用的工具包),javadoc.exe(文档生成工具)等。
jre目录:java运行时环境目录,包括java虚拟机,运行时的工具包,java引用启动器等。
include目录:jdk是由c和c++实现的,需要引用c的一些头文件。
lib目录:java类库或库文件,是开发工具使用的归档包文件。
src.zip:存放jdk的核心源代码。
javafx-src.zip:javase桌面引用开发的源文件。

JDK中最重要的就是java.exejavax.exe以及jvm(Java Virtual Machine),javac用于编译java代码,java用于启动jvm并运行java代码。

包的定义与使用

同文件系统对目录的管理一样,java也引入了包机制,程序可以通过包的声明来对类定义目录。java中包是用来存放类的,功能相同的类放在同一个包中。
声明包用package声明类用class,**包的声明只能位于java源文件的第一行。**通过import关键字引入不同包下的类,包于包直接用.来区分。

package chapter.exanmple.Student

import chapter2.example.Teacher

class User{
    
	//代码
}

使用import package.*来导入包下的所有类。

在JDK中,不同功能的类方法在不同功能的包下,其中java包及其子包是核心包,javax即子包是扩展包。
Java的核心包:

java.util:包含大量工具类,集合等,如Arrays,List,Set。
java.net:包含网络编程的相关接口和类。
java.io:java输入输出有关的接口和类。
java.awt:java构建图形化界面相关的包和类。
java.swing:和awt一样构建桌面应用,最新的模块由javafx。
java.sql:数据库编程。

Java编程基础

每种编程语言都有自己的一套编程规范。 Java也有自己的编程规范,比如代码关键字、标识符、代码编写等。

Java代码格式

  • Java代码必须放在一个种类中(面向对象的规范),类用class声明:
//声明一个Sutdent类
class Student{
    
	//Java代码
}
  • Java程序代码分为结构体定义语句和函数执行语句。前者用于定义类或方法,后者用于实现具体功能。
class Student{
    
	//定义变量
	String name="zhansan";
	//执行功能
	System.out.print(name);
}
  • Java代码严格区分大小写,每条语句需用;隔开,用+连接需要换行的代码。
class Student{
    
	//三个不同的变量
	String Name="zhansan";
	String name="zhansan";
	String NNAME="zahnsan";
	//
	System.out.println(Name
	+name+
	NAME);
	
}
  • 方法用括号()声明,方法名首字母小写
 public void show(){
    
        System.out.println(name+"---"+price);
    }
 
//声明格式
修饰符 返回值类型 方法名 (参数列表){
    
	//执行体
	return 返回值
}
  • Java的单行注释是//,多行注释是/*...*/,文档注释是/**...*/。文档注释是对一段代码的概括描述使用javadoc.exe将注释生成文档。

  • 运行java程序必须要有一个主函数main

public class HelloWorld {
    
    /* 第一个Java程序 * 它将输出字符串 Hello World */
    public static void main(String[] args) {
    
        System.out.println("Hello World"); // 输出 Hello World
    }
}

在这里插入图片描述

Java标识符

程序中需要标识符来标记包名、类名、方法名、参数和变量等,这些符号称为标识符。标识符可以由字母数字下划线和美元符号组成,但标识符不能以数字或java关键字开头。定义标识符遵循以下规范:

  1. 包名中的所有字母必须小写;
  2. 类名和接口名首字母大写;
  3. 常量名称全部大写,单词之间用下划线连接;
  4. 变量名和方法名的第一个单词小写,后续单词的第一个字母大写。

Java关键字

Java变量

Java 语言是一种强类型语言。强类型包括以下两层含义:所有变量必须先声明后使用。指定类型的变量只能接受与其匹配的类型的值。

程序运行过程中,产生的临时数据存储在内存中,这些数据是通过标识符来访问的。 Java 变量是通过引用类型定义的。

在这里插入图片描述
整数类型一个byte占8为依次是16,32,64位,long定义时超过int的范围需要加L后缀。
浮点类型定义时要加fd后缀,没有会当作double类型。当是科学表达法是e或E为以10为底+-为正或负。

double 

字符类,用'...'包裹。

变量类型转换

  • 自动类型转换

自动转化必须满足两个条件:两种数据类彼此兼容,目标的取值范围大于源类型范围。
数值类型之间满足这两个条件可以自动转化:整数之间,整数转float,其他类型转double。

byte b=3;
int a=b;
  • 强制类型转换

强制类型转化需要显示声明,强制类型转化可能会造成数据丢失。显示转换需要用(目标类型)标识

double a=34.5
int b=(int) a;

// b=34
char[] b='1234';
int a=(int) b;

变量作用域

Java中主要有如下几种类型的变量:局部变量,类变量(静态变量),成员变量(非静态变量)变量需要在其作用范围类才可以使用,这个作用范围为作用域。
方法中定义的变量都是局部变量:
在这里插入图片描述
成员变量,类变量定义在方法外类中,通过修饰语(public)来管理作用域,其实不仅可以在该包或类,方法中使用还能再其他包,模块中使用。请参阅访问权限部分
成员变量:

public class Book {
    
    public String name;
    public double price;

    public Book(String name, double price){
    
        this.name=name;
        this.price=price;
    }

    public void show(){
    
        System.out.println(name+"---"+price);
    }
}

Java运算符

算数运行算符

在这里插入图片描述

  1. 进行自增、自减操作时,符号在前,表示先进行自增或自减,然后再进行其他操作。后面的标志是先进行运算,然后进行自增或自减。
  2. 除法运算时,整数被除以整数,只有涉及小数时才能得到小数。
  3. 取模运算时,运算结果符号取决于%符号左边的数。
赋值运算符

在这里插入图片描述

  1. 可以使用一个赋值语句来对多个变量进行赋值:
int x,y,z;
x=y=x=5;
  1. 类似+=的符号都是先加再赋值:
int a=0;
a +=3;
//相当于a先加3再赋值给a
比较运算符

在这里插入图片描述

逻辑运算符

在这里插入图片描述

运算符优先级

在这里插入图片描述

分支结构

if...else分支:

//if选择
if(条件判断){
    
	//选择体
}

//if...else...
if(...){
    
	//
}
else{
    
	//
}

//if...else if ... else ...
if(...){
    
	//
}
else if(...){
    
	//
}
else{
    
	//
}

switch分支

switch(条件){
    
	case 条件值1: 
		//
		break;
	case 条件值1: 
		//
		break;
	...
	default:
		//
		break;
}

循环结构

while 循环

while(循环条件){
    
	//执行语句
}

do...while 循环

//do...while循环会先执行依次子判断
do{
    
	//执行语句
}while(循环条件);

for循环

for(初始条件;循环条件;操作表达式){
    
	//循环体
}

breakcontinue:break是跳出整个循环,continue是结束本次循环。

方法

方法是可重用的单元。

方法定义

修饰符 返回值类型 方法名(参数类型 参数名){
    
    ...
    方法体
    ...
    return 返回值;
}

在这里插入图片描述

在这里插入图片描述
方法重载
Java程序允许再类中定义多个同名的方法,但是参数的类型和个数必须不同,这就是方法的重载。

class AddNumber{
    
	public int add(int a,int b){
    
		return a+b;
	}
	public int add(int a,int b,int c){
    
		return a+b+c;
	}
}

方法是解决一类问题的步骤的有序组合。方法包含在类或对象中。方法在程序中创建并在其他地方引用。

方法调用
Java 支持两种调用方法的方式,根据方法是否返回值来选择。

当程序调用方法时,程序的控制权将转移到被调用的方法。当执行被调用方法的返回语句或到达方法体右括号时,控制权返回给程序。

数组

您可以使用以下格式在 Java 中定义数组:

//声明式定义
int [] arr=new int[100];
/* 含义是声明一个数组命名为arr占100个空间 */

//初始化定义
int[] arr={
    ...}
/* 含义是声明一个int数组,赋值内容 */

数组初始化:

int [] a=new int[]{
    1,2,3,4};  //定义有空间,初始化要一致
int [] b={
    1234};

数组是通过下标访问的。

多维数组:

int [][] arr=new int[][];
//定义是可以直接定义为几行几列直接在[]赋值

int [][] arr={
    {
    1,2,3},{
    4,5,6}};
//定义时初始化,标识两行三列的数组

面向对象

说到面向对象,首先想到的就是面向过程。面向过程就是分析解决问题所需的方法步骤,然后一一实施这些步骤。面向对象就是将解决问题的任务划分为对象,然后通过调用对象来解决问题。在C语言中,不同的文件通过引用头文件来直接相互引用,但是这些头文件中的内容即使不需要也被直接执行。在面向对象中,对象在执行之前被实例化,并且在使用时被获取。

面向对象的特性

在这里插入图片描述

封装

类似对象的

类是对抽象事物的描述,对象是某一类事物的个体。各种对象都是通过类的实例化获得的。

类定义和对象创建

定义类用class关键字,创建对象用new关键字,类成员变量或方法的引用用.

修饰词 class 类名{
    
	//成员变量
	//成员方法

}
类名 变量 = new 类名();
public Person{
    
	public int age;

}

Person person=new Person();
prson.age;

变量在类中定义为成员变量,在方法中定义为局部变量。

类封装

类的封装是指在定义一个类时将类的属性私有化,使用private关键字,私有化的属性只能在类中被访问,外界想访问需要使用public关键字修饰公有方法,其中包括gettersetter方法。

public class Student{
    
	private int age;

	public void setAge(int age){
    
		this.age=age;
	}
	public int getAge(){
    
		return this.age
	}
	public String toString(){
    
		return this.age;
	}
}
施工方法

在类中,实例化类时,必须通过setter方法给属性赋值,并通过getter方法获取属性值。构造函数可以在实例化的同时给属性赋值。

构造方法的定义

要在类中定义构造函数方法,必须满足三个条件:

  1. 方法名与类名相同
  2. 方法名前没有返回值类型的声明
  3. 方法中没有返回值

构造函数重载
构造方法也可以重载,只要满足重载的条件,参数类型不同,参数个数不同即可。

在Java中,每个类都至少有一个构造函数。如果没有构造函数,系统会自动创建一个构造函数(无参数,无方法体)。

这个关键字
在类的方法中,变量的作用域是方法体内,如果要访问成员变量需要通过this关键字,this.成员变量this表示当前对象。

  • 可以通过this来访问类的成员变量
  • 可以通过 this 访问成员方法
  • 构造方法是实例化时调用的,也可以通过this调用this(参数列表)
垃圾收集

System.gc()实现垃圾回收。

静态关键字

Java的static关键字,用于修饰类的成员,如成员变量,成员方法,以及代码块。static修饰的变量为静态变量,静态变量被所有实例共享,通过类名.方法名访问不需要实例化,每次引用同一个对象。修饰方法为静态方法,也通过类名.方法名调用。修饰代码块,为静态代码块,类被加载时静态代码块会执行,静态代码块只执行一次。

最终关键字

final关键字用于修饰类,变量和方法,它时最终的含义,用该关键字修饰的类,方法,变量具有以下特性:

  1. Final修饰的类不能被继承
  2. 最终修改的方法不能被覆盖
  3. 由final修饰的变量是常量,只能赋值一次。

Java允许在类内定义类,称为成员内部类通过外部类.内部类 变量=new 外部类().new内部类()调用。

继承

继承是指在现有类的基础上构建新的类。构造出来的类是一个子类,子类自动拥有父类的所有属性和方法。

扩展关键子继承
一个类只能有一个直接父类。

public class Pig extends Animals{
    
	...
}

重写父类方法
在继承中,子类会继承父类的属性和方法,有时需要对父类的方法重写,重写需要与父类具有相同的方法名,参数列表及返回值类型。

超级关键词
子类重写父类方法后,需要访问父类的属性或方法用super关键字。super.成员变量super.成员方法(参数对列),访问父类的构造方法super(参数对列)

抽象类
当类的方法无法具体定义时,可以将其定义为抽象类,抽象类允许成员方法没有方法体,而具体的实现方法在继承的子类重写实现。抽象类通过abstract修饰。

抽象类无法实例化,需要通过子类继承并实例化。

abstract class Animal{
    
	abstract void shout();
} 

class Dog extends Animal{
    
	void shout(){
    
		System.out.println("汪汪");
	}
}

界面
当一个抽象类的所有方法都为抽象方法时,可以将该类定义为接口。接口克服了单继承的限制,一个类可以实现多个接口,接口的变量默认public static final修饰,即全局变量;接口的方法默认public修饰。

定义接口通过interface关键字,并由implements关键字实现该接口。多个接口的实现用,隔开。

//定义接口
public interface 接口名{
    
	[默认public static finnal修饰] 变量类型  变量
	[默认public abstract修饰] 方法名(参数列表)
}

//接口的实现类
public 类名 implements  接口名{
    
	//
} 


//实现多个接口
public implements 接口名1,接口名2 ...{
    
	//
}

多态

实例化类时,需要声明类的类型。由于实现的类不同而产生不同效果的现象就是多态。继承是多态性的基础。

//父类作为声明对象,子类作为实例化对象
Animal animal=new Dog()
/* 此时的animal具有Dog的特性 */

Animal animal=new Pig()
/* 此时的animal具有Pig的特性 */

对象类型的转换,子类当作父类对象使用。Animal animal=new Dog(),父类对象当作子类使用Dog dog=new Animal()

对象类
Object类是类参差结构的根类,所有类都直接或间接继承该类。

异常

程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。Exception 类是 Throwable 类的子类。除了Exception类外,Throwable 还有一个子类 Error 。Java 程序通常不捕获错误。Error 用来指示运行时环境发生的错误。
在这里插入图片描述
在这里插入图片描述

捕获异常

try..catch捕获异常
try
{
    
   // 程序代码
}catch(ExceptionName e1)
{
    
   //Catch 块
}

//throws抛出异常
throws/throw关键字

public class className
{
    
   public void deposit(double amount) throws RemoteException
   {
    
      // Method implementation
      throw new RemoteException();
   }
   //Remainder of class definition
}

最后关键字
finally 关键字用来创建在 try 代码块后面执行的代码块。无论是否发生异常,finally 代码块中的代码总会被执行。

 try{
    
    // 程序代码
 }catch(异常类型1 异常的变量名1){
    
    // 程序代码
 }catch(异常类型2 异常的变量名2){
    
    // 程序代码
 }finally{
    
    // 程序代码
 }

可以使用多个catch语句,每个catch捕获相应的Exception及其子类。 JVM捕获异常后,会从上到下匹配catch语句。匹配到某个catch后,就会执行catch代码块,然后不再继续匹配。简单来说:多个catch语句只能执行其中一个。当有多个catch时,catch的顺序非常重要:子类必须先写。 finally 语句块保证执行,无论错误如何。

如何处理异常

在这里插入图片描述

try
{
    
   // 程序代码
}catch(Exception e)
{
    
   e.printStackTrace();
}

访问权限

类、成员变量和方法的修饰符控制它们的访问权限。

在这里插入图片描述

Java API

API是应用程序接口,调用Java的接口来实现各种功能。

String类

字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串。
在这里插入图片描述
最简单的创建方法:


String hello= "Hello world!";

Java StringBuffer 和 StringBuilder 类

修改字符串时,需要使用StringBuffer和StringBuilder类。

与 String 类不同,StringBuffer 和 StringBuilder 类的对象可以多次修改,而无需创建新的未使用的对象。

StringBuilder类是在Java 5中提出的,它与StringBuffer最大的区别在于StringBuilder的方法不是线程安全的。

Java Number类

data的基本数据类型:byte、int、short、long、double、float、boolean、char;

对应的包装类型也有八种:Byte、Integer、Short、Long、Double、Float、Character、Boolean;

基本数据类型只能存储变量,而相应的包装类包含操作变量的方法。

Java Character类

Java 语言为内置数据类型 char 提供了包装类 Character 类。Character类的用法:Character 类提供了一系列方法来操纵字符。
你可以使用 Character 的构造方法创建一个 Character 类对象,例如:

Character ch = new Character('a');

Date类

java.util包提供了Date类来封装当前日期和时间。

//获取的是系统的时间戳
DateFormat format=new SimpleDateFormat("YYYYMMdd");
//格式化时间

System与Runtime类

在这里插入图片描述
runtime类表示虚拟机的运行状态,用于封装JVM进程,该类是单例模式,对象不能直接实例化,通过:

Runtime run=Runtime.getRuntime();

Scanner 类

java.util.Scanner是Java5的新特性。我们可以通过Scanner类获取用户输入。

 Scanner sc = new Scanner(System.in); 

Scanner 类的 next() 和 nextLine() 方法获取输入字符串。在读取之前,我们一般需要使用hasNext和hasNextLine来判断是否还有输入数据:

import java.util.Scanner; 

public class ScannerDemo {
      
    public static void main(String[] args) {
      
        Scanner scan = new Scanner(System.in); 
		// 从键盘接收数据 

		//next方式接收字符串
        System.out.println("next方式接收:");
        // 判断是否还有输入
        if(scan.hasNext()){
       
        	String str1 = scan.next();
        	System.out.println("输入的数据为:"+str1);  
        }  

    }  
} 

next()与nextLine()区别
next():

1、一定要读取到有效字符后才可以结束输入。
2、对输入有效字符之前遇到的空白,next()方法会自动将其去掉。
3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
next()不能得到带有空格的字符串。
nextLine():

1、以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。
2、可以获得空白。

Math与Random类

Math是数学计算类,random用于生成随机数。

import java.lang.math;

Random random=new Random();

在这里插入图片描述

集合

在这里插入图片描述

集合接口方法:

在这里插入图片描述

List接口

List接口方法:
在这里插入图片描述
ArrayList和LinkedList是顺序表和链表。

Iterrater接口

迭代器接口
Iterater接口是逸代器,用来遍历集合的元素。

ArrayList list=new ArrayList();

Iterater iterater=new Iterater();
while(iterater.hasNext()){
    
	Object obj=iterater.next();
	System.out.print(obj);
}

foreach循环
foreach循环也是用来遍历集合的元素的。

for(容器中元素类型 变量 : 集合容器){
    
	//执行语句
}

Set接口

set接口中的元素不重复,set和list的访问元素相同。

Map接口

地图界面
Map接口时一种双列集合,每个元素存储一个键(key)对象和一个值对象(value),键和值对象对应关系为映射。Map的一个元素时一个Entry包含一个key-value。Map的键必须唯一。遍历Map通过获取键来遍历所有键取值或获取Entry再遍历。
在这里插入图片描述

Properties集合

属性集合
Properties集合主要用来存储key-value字符串的,通过该集合来获取配置项。通过setPropertiesgetPropertes存取字符串,通过propertiesNames()方法得到包含所有键的集合对象。

泛型

集合可以存储任何类型的对象,但是把一个对象存入到集合后,集合会忘记这个对象的类型,只有再取出的时候,才编译为Object类型。如果事先不记得,声明时发生类型转换就会出错。Java引入了泛型的概念,即参数化类型。在操作集合时限定元素的类型,在定义集合时通过<T>指定该集合中元素数据类型,这样显示声明,就可以知道集合中元素的类型了。

//声明泛型
ArrayList<String> arr=new ArrayList<String>();

//该List集合只能存储String类

IO

应用程序之间需要与设备之间进行数据传输,例如显示屏输入数据,显示程序运行结果。在Java中不同设备之间的数据传输称为。位于java.io包中。

IO流有很多,按照操作数据的不同分为字节流和字符流,按照传输方向的不同分为输入流和输出流。
在这里插入图片描述
在IO包中字节流的输入输出用java.io.InputStreamjava.io.OutputStream
在IO包中字符流的输入输出用java.io.Readerjava.io.Writer

在这里插入图片描述
字节流 输入流
在这里插入图片描述

  1. InputStream是所有输入字节流的父类,它是一个抽象类。

  2. ByteArrayInputStream、StringBufferInputStream(上图中的StreamBufferInputStream)、FileInputStream是三种基本的媒体流。它们分别从Byte数组、StringBuffer和本地文件中读取数据。

  3. PipedInputStream 从与其他线程共享的管道中读取数据。

  4. ObjectInputStream 和 FilterInputStream 的所有子类都是装饰流(装饰器模式的主角)。

字节输出流
在这里插入图片描述

  1. OutputStream是所有输出字节流的父类,它是一个抽象类。

  2. ByteArrayOutputStream 和 FileOutputStream 是两种基本的媒体流。它们分别将数据写入字节数组和本地文件。 PipedOutputStream 将数据写入与其他线程共享的管道。

  3. ObjectOutputStream 和 FilterOutputStream 的所有子类都是装饰流。

字符流输入流:
在这里插入图片描述

  1. Reader是所有输入字符流的父类,它是一个抽象类。

  2. CharReader和StringReader是两种基本的媒体流,分别从Char数组和String中读取数据。 PipedReader 从与其他线程共享的管道中读取数据。

  3. BufferedReader显然是一个装饰器,它及其子类负责装饰其他Reader对象。

  4. FilterReader 是所有自定义特定装饰流的父类。它的子类 PushbackReader 修饰 Reader 对象并添加行号。

  5. InputStreamReader是连接字节流和字符流的桥梁。它将字节流转换为字符流。 FileReader可以说是实现这个功能的常用工具类。在其源码中,明显使用了将FileInputStream转换为Reader的方法。我们可以从这堂课中学到一些技巧。 Reader中各个类的用途和用法与InputStream中的基本相同。后面Reader和InputStream就会有对应关系。

字符输出流:
在这里插入图片描述

  1. Writer是所有输出字符流的父类,是一个抽象类。

  2. CharArrayWriter 和 StringWriter 是两种基本媒体流,分别将数据写入 Char 数组和 String。 PipedWriter 将数据写入与其他线程共享的管道。

  3. BufferedWriter是一个装饰器,为Writer提供缓冲功能。

  4. PrintWriter和PrintStream非常相似,它们的功能和用途也非常相似。

  5. OutputStreamWriter是OutputStream转换为Writer的桥梁,它的子类FileWriter实际上就是实现这个功能的具体类。功能和用法与OutputStream非常相似。

系统类 系统支持IO

System类支持IO,并且系统类的方法是静态的。直接调用系统就可以了。系统提供标准的输入输出设备,如键盘、显示器等,用于IO的信息交换。

在这里插入图片描述
System.in(标准输入),通常代表键盘输入。借助Scanner类。

System.out(标准输出):通常写往显示器。

System.err(标准错误输出):通常写往显示器。

字节流

在计算机中,无论时文本,图片,还是音频,视频,所有文件都是以二进制(字节)形式存在的,IO中针对字节的输入输出统称为字节流。输入输出用java.io.InputStreamjava.io.OutputStream是两个顶级接口。
在这里插入图片描述

InputStream的常用方法
在这里插入图片描述
OutputStream的常用方法
在这里插入图片描述
在这里插入图片描述
FileInputStream 常用的构造方法主要有如下两种重载形式。

  • FileInputStream(File file):通过打开与文件系统中File对象文件指定的实际文件的连接来创建FileInputStream。
  • FileInputStream(String name):通过打开文件系统中路径名 name 指定的实际文件的链接来创建 FileInputStream。

FileOutputStream类的构造方法主要有以下四种重载形式。

  • FileOutputStream(File file):创建文件输出流,参数file指定目标文件。
  • FileOutputStream (File file, boolean append):创建文件输出流。参数文件指定目标文件。指定是否在目标文件内容末尾添加数据。如果为真,则添加在最后;如果为假,则覆盖原始内容。有内容;它的默认值为 false。
  • FileOutputStream(String name):创建文件输出流。参数name指定目标文件的文件路径信息。
  • FileOutputStream(String name,booleanappend):创建文件输出流,参数name和append含义同上。

字节流读取文件

FileInputStream(String fileName);
//创建文件输入流

文件数据是一种常见的IO操作,对文件的读写有专门的两个类FileOutputStreamFileInputStream

//核心步骤

FileInputStream fis2 = new FileInputStream("F:/mxl.txt");
//处理传递文件名也可以传递File对象

字节流输出文件

FileOutputStream(String fileName,boolean append)
//创建文件输出流,append表示是否为追加

定义文件路径是要是用\\因为\是表示转义字符。

字节缓冲流
在字节流读取中通过read方法,将字节读取一个一个读取到目标中,这样效率很低,虽然提供了read(byte [] byte)方法,但是事先并不知道字节流长度。Java提供了字节缓冲流来提高效率。

在这里插入图片描述
用法都差不多。

字符流

尽管 Java 中字节流的功能十分强大,几乎可以直接或间接地处理任何类型的输入/输出操作,但使用字符流是操作字符集更方便。
在这里插入图片描述

在这里插入图片描述
Java 提供了用来读取字符文件的便捷类——FileReader。该类的构造方法有如下两种重载形式。

  • FileReader(File file):根据要从中读取数据的文件创建一个新的 FileReader 对象。其中 file 表示要从中读取数据的文件。
  • FileReader(String fileName):根据要从中读取数据的文件名创建一个新的 FileReader 对象。其中,fileName表示要读取数据的文件名,表示文件的完整路径。

Java提供了一个方便的类来编写字符文件——FileWriter。该类的构造函数有以下四种重载形式。

  • FileWriter(File file):根据给定的 File 对象构造一个 FileWriter 对象。其中,file表示要写入数据的File对象。
  • FileWriter(File file,boolean append):用指定的 File 对象构造一个 FileWriter 对象。如果append的值为true,则字节将写入文件末尾而不是文件开头。
  • FileWriter(String fileName):根据给定的文件名构造一个 FileWriter 对象。其中,fileName表示要写入字符的文件名,表示完整路径。
  • FileWriter(String fileName,boolean append):根据给定的文件名和写入文件的位置构造一个 FileWriter 对象。其中,append是一个布尔值。如果为 true,则数据将写入文件末尾而不是文件开头。

字符缓冲流

  • 字符缓冲区输入流

BufferedReader类主要用于辅助其他字符输入流。它有一个缓冲区,可以先将一批数据读入内存缓冲区。后续的读取操作可以直接从缓冲区获取数据,而不需要每次都从数据源读取数据并进行字符编码转换,可以提高数据读取的效率。

BufferedReader类的构造函数有以下两种重载形式。

  • BufferedReader(Reader in):创建一个BufferedReader,用于修改参数in指定的字符输入流。
  • BufferedReader(Reader in,int size):创建一个BufferedReader来修改参数in指定的字符输入流,参数size用于以字符为单位指定缓冲区的大小。

BufferedReader 还提供了 readLine() 方法,该方法返回一个包含该行内容的字符串,不带任何终止符,如果已到达流末尾,则返回 null。 readLine()方法表示一次读取一行文本内容。当换行符(\n)、回车符(\r)或回车符后面直接跟换行符时,则认为一行已终止。

  • 字符缓冲区输出流

BufferedWriter类主要用于辅助其他字符输出流。它还有一个缓冲区。您可以先将一批数据写入缓冲区。当缓冲区满时,可以立即将缓冲区中的数据写入字符输出流。其目的是提高数据写入效率。

BufferedWriter类的构造函数有以下两种重载形式。

  • BufferedWriter(Writer out):创建一个BufferedWriter,用于修改参数out指定的字符输出流。
  • BufferedWriter(Writer out,int size):创建一个BufferedWriter,用于修改参数out指定的字符输出流。参数 size 用于指定缓冲区的大小(以字符为单位)。

该类除了为字符输出流提供缓冲区外,还提供了一个新方法newLine(),用于写入行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个换行符 (\n)。

文件类

在Java中,File类是java.io包中唯一代表磁盘文件本身的对象。也就是说,如果要在程序中操作文件和目录,可以通过File类来进行。 File类定义了一些操作文件的方法,例如创建、删除、重命名文件和目录。

File 类无法访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

系统流

每个Java程序运行时都会有一个系统流,系统流对应的类是java.lang.System。 Sytem类封装了Java程序运行时的三个系统流程,分别通过in、out和err变量来引用。

  • System.in:标准输入流,默认设备是键盘。
  • System.out:标准输出流,默认设备是控制台。
  • System.err:标准错误流,默认设备是控制台。

System.in 是InputStream 类的对象。 System.in.read()方法实际上访问的是InputStream类定义的read()方法。该方法从键盘读取一个或多个字符。 System.out输出流主要用于向控制台输出指定的内容。

System.out 和 System.error 是 PrintStream 类的对象。由于 PrintStream 是从 OutputStream 派生的输出流,因此它还实现了低级 write() 方法。因此,除了print()和println()方法可以完成控制台输出外,System.out还可以调用write()方法来实现控制台输出。

PrintStream和PrintWriter

PrintStream 扩展了 OutputStream 的接口,并提供了用于写入各种数据类型的附加方法:

  • 写int: print(int)
  • 写入布尔值: print(boolean)
  • 写入字符串: print(String)
  • 写入Object:print(Object),实际上相当于print(object.toString())

避免了只能通过write来写入字节的缺陷。经常使用的System.out.println()实际上是使用PrintStream来写入各种数据。其中System.out是系统默认提供的PrintStream。

与OutputStream相比,PrintStream不仅增加了一组可以打印各种数据类型的print()/println()方法,更加方便,它还有一个额外的优点,就是不会抛出IOException,所以当我们写的时候代码中,无需捕获 IOException。

PrintStream最终输出的始终是字节数据,而PrintWriter扩展了Writer接口,其print()/println()方法最终输出的是char数据。

. . .

相关推荐

额外说明

Mybatis中如何使用CDATA标签避免因无法识别特殊符号>或<而导致的解析错误

我们在SpringBoot+Mybatis框架中常常会在xxmapper.xml中写一些sql,但是在 xml 元素中,"<" 、">" 等对比大小的符号和"&" 是非法的。原因是"<" 会产生错误,因为解析器会把该字符解释为新元素的开始;"&" 也会产

额外说明

leetcode每日一题:134.加油站

系列:贪心算法 语言:java 题目来源:Leetcode134. 加油站 题目 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost

额外说明

【Unity3D日常开发】有限状态机的简单实现

推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一、前言 Hello,大家好,我是☆恬静的小魔龙☆,正所谓学而不思则罔,思而不学则殆,最近项目开发中,人物的动作特别多,用状态机去

额外说明

上传jar包到nexus服务器

1,首先需要登录 nexus服务器。 2,点击upload,选择maven-release。 3,点击browse选择你要上传的jar。 4,填写Group ID,Artlfact ID,Version 信息,记得勾选“Generate a POM fi

额外说明

【Java 进阶篇】JavaScript 表格全选案例详解

在网页开发中,表格(Table)是一种常用的HTML元素,用于以表格形式展示数据。对于包含大量数据的表格,提供一个全选复选框可以极大地提高用户体验,方便用户一次性选择或取消选择所有项目。本篇博客将详细介绍如何使用JavaScript创建一个表格全选功能,

额外说明

Spring RCE 漏洞 CVE-2022-22965 的终极解决方案

在 Spring 框架RCE 安全漏洞及解决方式介绍了 Spring框架爆出的RCE(远程命令执行)漏洞,现在这个漏洞有了统一的编号: CVE-2022-22965。 这个漏洞的主要原因是在JDK 9+版本里,Spring MVC 的数据绑定时出现的漏洞

额外说明

JavaScript学习笔记:AJAX基础

文章目录 一、准备工作 任务1、安装`phpstudy_pro`并启动`Apache`服务 任务2、下载HBuilder X,创建HBuilder项目 任务3、输入城市代码,返回城市天气预报信息 1、创建task01.php页面 2、创建do_task0

额外说明

【Rust 基础篇】Rust 特征(Traits)

文章目录 导言 一、特征的定义和基本语法 二、特征的默认实现 三、泛型特征 四、特征的实现和使用 总结 导言 Rust 的特征(Traits)是一种强大的语言机制,它允许我们定义共享行为并实现代码的抽象。通过特征,我们可以编写更加灵活和可复用的代码。本篇

额外说明

面向Java开发者的ChatGPT提示词工程(2)

在这篇博客文章中,我将分享一些关于提示词的关键原则,帮助你在使用语言模型时获得更好的结果。具体来说,我将介绍两个关键原则,帮助你编写有效的提示词。同时,我也鼓励你在阅读文章的过程中运行代码,亲自体验不同提示词的输入和输出效果。 我将在本文中概述一些基本原

额外说明

Notepad++实用功能分享(正则行尾行首替换常用方法、文本比对功能等)

很多时候需要给多行文本的前后加字符或者文本,一行一行添加是在太麻烦了。notepad++提供了一键替换的功能。 替换常用方法 打开nodepad++软件,使用ctrl+H进入替换选择框,然后勾选循环查找(wrap around),查找模式选择正则表达式(

ads via 小工具