《java之输入输出流》PPT课件.ppt_第1页
《java之输入输出流》PPT课件.ppt_第2页
《java之输入输出流》PPT课件.ppt_第3页
《java之输入输出流》PPT课件.ppt_第4页
《java之输入输出流》PPT课件.ppt_第5页
已阅读5页,还剩195页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

输入输出流,什么是“流”?,流(stream)是一个信息的逻辑实体,它通过Java输入/输出系统与物理设备相连。 从源到目的地的字节的有序序列 流是指数据传输时的形态 尽管与“流”链接的物理设备不尽相同,但是所有流的行为具有同样的方式。 最大特点是数据的获取和发送均按照顺序进行。,各种“流”,数据流:是指在计算机的输入输出之间运动的数据序列。 输入输出是相对程序来说的,程序扮演两个角色:源和目的。 输入流:代表从外设流入程序的数据序列; 输出流:代表从程序流向外设的数据序列。 字节流:在输入输出过程中以字节为单位。 字符流:在输入输出过程中以字符为单位。 缓冲流:通过建立输入输出缓冲区,提高数据输入输出的效率,程序,文件,程序,文件,输入流,输出流,源,输入流通过使用read( )方法 从输入流读出源中的数据,目的地,输出流通过使用write( )方法把数 据写入输出流并传送到目的地,输入流示意图,输出流示意图,标准输入输出,System.in InputStream 从键盘读入数据 System.out PrintStream public void print ( 输出参数 ) public void println ( 输出参数 ) System.err PrintStream 用于向屏幕输出错误信息,java.io包,java.io包中提供了各种各样的输入输出流类,它们都是Object类的直接子类,每一个流类代表一种特定的输入或输出流。 根据流相对于程序的另一个端点的不同,分为节点流和过滤流 节点流:以特定源,例如磁盘文件、内存某区域或线程之间的管道为端点构造的输入/输出流 过滤流:以其他已经存在的流为端点构造的输入/输出流,基本流类的继承关系,基本输入流(InputStream)和基本输出流(OutputStream)是处理以8位字节为基本单位的字节流类,读写以字节为单位进行 在Java中,用InputStream类来描述所有输入流的抽象概念,InputStream的常用方法 public abstract int read( ) 从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。 public int read(byte b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。如果到达流末尾,则返回值 -1。 public int read(byte b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组。以整数形式返回实际读取的字节数。,public long skip(long n) 跳过和丢弃此输入流中数据的 n 个字节。返回实际跳过的字节数 public int available( ) 返回可用的未阻塞的字节数 public void close() 关闭输入流 public void mark(int readlimit) 在输入流的当前位置做标记,从当前位置最多还能读取readlimit个字符,OutputStream的常用方法 public abstract void write(int b) 将指定的字节写入此输出流。 public void write(byte b) 将 b.length 个字节从指定的 byte 数组写入此输出流。 public void write(byte b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。 public void close() 关闭此输出流并释放与此流有关的所有系统资源。 public void flush() 刷新此输出流并强制写出所有缓冲的输出字节。,public abstract void write(int b) throws IOException 只能写入低字节,java.io.ByteArrayInputStream,java.io.FileInputStream,java.io. FilterInputStream,java.io.ObjectInputStream,java.io.PipedInputStream,java.io.SequenceInputStream,java.io.StringBufferInputStream,javax.sound.sampled.AudioInputStream,java.io. InputStream,java.io. FilterInputStream,回压输入流,缓冲输入流,数据输入流,java.io. FilterOutputStream,java.io.BufferedOutputStream,java.util.zip.CheckedOutputStream,javax.crypto. CipherOutputStream,java.io. DataOutputStream,java.util.zip.DeflaterOutputStream,java.security.DigestOutputStream,java.util.zip.InflaterOutputStream,java.io. PrintStream,格式化输出流,缓冲输出流,数据输出流,ByteArrayInputStream、ByteArrayOutputStream ByteArrayInputStream 包含一个内部缓冲区,该缓冲区存储被读取的字节。 在ByteArrayOutputStream中,数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长 FileInputStream、FileOutputStream FileInputStream 从文件系统中的某个文件中获取输入字节。 FileOutputStream是用于将数据写入 File 或 FileDescriptor 的输出流。,FilterInputStream、FilterOutputStream FilterInputStream 包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。 FilterOutputStream位于已存在的输出流(基础 输出流)之上,它们将已存在的输出流作为其基本数据接收器,但可能直接传输数据或提供一些额外的功能。,ObjectInputStream、ObjectOutputStream ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。 ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。 ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream 只能将支持 java.io.Serializable 接口的对象写入流中。,PipedInputStream和PipedOutputStream 管道输入流应该连接到管道输出流 管道输入流提供要写入管道输出流的所有数据字节 通常,数据由某个线程从 PipedInputStream 对象读 取,并由其他线程将其写入到相应的PipedOutputStream。 BufferedInputStream和BufferedOutputStream 创建 BufferedInputStream 时即创建了一个内部缓冲区数组。 通过设置BufferedOutputStream ,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统 关闭BufferedOutputStream时,如果缓存未满,就强迫将数据压入输出流中,StringBufferInputStream StringBufferInputStream类允许应用创建一个输入流,从某一串中读取流的字节数据。 SequenceInputStream SequenceInputStream 表示其他输入流的逻辑串联。 它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。 LineNumberInputStream 提供跟踪当前行号的附加功能。 行是以回车符 (r)、换行符 (n) 或回车符后面紧跟换行符结尾的字节序列。,PushbackInputStream PushbackInputStream 为另一个输入流添加性能,即“推回 (push back)”或“取消读取 (unread)”一个字节的能力。 在代码片段可以很方便地读取由特定字节值分隔的不定数量的数据字节时,这很有用;在读取终止字节后,代码片段可以“取消读取”该字节,这样,输入流上的下一个读取操作将会重新读取被推回的字节。,public void unread(int b),推回一个字节。,DataInputStream、DataOutputStream 数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。 ProgressMonitorInputStream 在读取文件时会弹出一个显示读取速度的进度条 PrintStream PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。 与其他输出流不同,PrintStream 永远不会抛出 IOException;而是,异常情况仅设置可通过 checkError 方法测试的内部标志。,标准输入和输出,在Java中,标准输入是键盘,标准输出是显示器屏幕 System类管理标准输入输出流和错误流。 类中申明了如下类变量: public static final InputStream in public static final PrintStream out public static final PrintStream err,System.in:从标准输入获取输入(通常是键盘) System.in是InputStream类的对象,使用read()和skip(long n)方法读取。 一直打开并准备好提供输入的数据 System.out:把输出送到缺省的显示(通常是显示器) System.out是PrintStream类的对象,使用print()和println()来输出。 一直打开并准备好接收输出的数据 System.err:把错误信息送到缺省的显示,标准输入输出示例:,import java.io.*; public class StandardIO public static void main(String args ) int ch; System.out.println(“请输入一行字符“); try while(ch=System.in.read()!=r) System.out.write(ch); catch(IOException e) System.out.println(e.toString(); System.out.write(n); ,思考:程序结果?,import java.io.*; public class IOTest public static void main(String args) try byte bArray=new byte128; System.out.println(“Enter something:”); System.in.read(bArray); System.out.println(“You entered:”); System.out.println(bArray); catch(IOException ioe) System.out.println(ioe.toString(); ,结果:,原因:System.out.println(bArray)输出的是数组的地址而不是字符 改进:将字符数组变换成字符串 before:System.out.println(bArray); now:String s=new String(bArray,0,bArray.Length); System.out.println(s);,byte buffer=new byte200; int d=0,count=0; try count=System.in.read(buffer); catch (Exception e) System.out.print(e); for (int i=0; icount; i+) System.out.print(char)bufferi); System.out.println(“Input ten char:”); for (int i=1; i=10; i+) try d=System.in.read(); System.out.println(char)d); catch (Exception e) System.out.print(e); ,如何判断一个文件是否具有下列属性 是否可读? 是否可写? 文件长度是多少? 文件是否存在? 文件的名称是什么? 文件的绝对路径是什么? 文件的父目录是什么? 是文件夹还是文件? 是否隐藏? 最后修改的时间为什么?,File dir=new File(“E:myjavakafei“); File f1=new File(“E:myjavakafei“,“CheckBoxExp.java“); System.out.println(f1.getName()+“可读吗?“+f1.canRead(); System.out.println(f1.getName()+“可写吗?“+f1.canWrite(); System.out.println(f1.getName()+“的长度为“+f1.length(); System.out.println(f1.getName()+“的绝对路径为“+f1.getAbsolutePath(); System.out.println(f1.getName()+“是目录吗?“+f1.isDirectory(); System.out.println(dir.getName()+“是目录吗?“+dir.isDirectory(); System.out.println(f1.getName()+“是隐藏的吗?“+f1.isHidden(); System.out.println(f1.getName()+“最后修改的时间为“+f1.lastModified(); System.out.println(f1.getName()+“的父目录为“+f1.getParent();,File类,构造方法 public File(String pathname) public File(String parent, String child) public File(File parent, String child) 获取文件信息的方法 public String getName() public boolean canRead() public boolean canWrite() public boolean exists(),public long length() public String getAbsolutePath() public String getParent() public boolean isFile() public boolean isDirectory() public boolean isHidden() public long lastModified(),如何进行对目录的下列操作 如何创建一个目录? 如何列出目录中的所有文件? 如何列出目录中满足要求的文件?,目录 创建目录 public boolean mkdir() 列出目录中的文件 public String list() public String list(FilenameFilter filter) public File listFiles() public File listFiles(FilenameFilter filter) FilenameFilter接口 boolean accept(File dir, String name),class FileAccept implements FilenameFilter String str=null; FileAccept(String s) str=“.“+s; public boolean accept(File dir, String name) return name.endsWith(str); ,File dir=new File(“E:myjavakafei“); FileAccept acceptCondition=new FileAccept(“java“); String fileName=dir.list(acceptCondition); for (int i=0; ifileName.length; i+) System.out.println(fileNamei); ,如何进行对文件的下列操作? 如何创建一个文件? 如何删除一个文件? 如何重命名文件? 如何运行一个可执行文件?,文件的创建与删除 public boolean createNewFile( ) public boolean delete( ) 文件的重命名 public boolean renameTo(File dest) 运行可执行文件 可使用java.lang包中的Runtime类编译、执行、打开文件或执行其它操作 Runtime类的方法 public static Runtime getRuntime( ) public Process exec(String command) 步骤: Runtime ec=Runtime.getRuntime( ); ec.exec();,若E:myjavakafei下无文件夹newdir存在,则创建新文件夹newdir 在E:myjavakafeinewdir下创建新文本文件newfile,并更名为newf 编译并执行当前目录下的文件ButtonLabelExp.java,File dir=new File(“E:myjavakafeinewdir“); if (!dir.exists() dir2.mkdir(); File file=new File(dir,“newfile.txt“); file.createNewFile(); File file2=new File(dir,“newf.txt“); if (file.renameTo(file2) System.out.println(“Rename successful!“); else System.out.println(“Rename failed!“); catch (Exception e) System.out.println(“Error occured!“+e); ,try Runtime ce=Runtime.getRuntime(); ce.exec(“javac ButtonLabelExp.java“); ce.exec(“java ButtonLabelExp“); catch (Exception e) System.out.println(e); ,如何以字节形式读取一个文件并显示在屏幕上? 如何将从键盘输入的文本以字节形式保存到文件中?,hello.txt,程序,hello.txt,程序,例:读取一个文件的内容并显示在屏幕上,byte fileContent=new byte20; int b; try File f=new File(“ButtonLabelExp.java“); FileInputStream in=new FileInputStream(f); while (b=in.read(fileContent,0,20)!=-1) String s=new String(fileContent,0,b); System.out.println(s); in.close(); catch (IOException e) System.out.println(“error occured in file read!“+e); ,例:从键盘输入一行文本到文件中,byte buffer=new byte100; try File f=new File(“line.txt“); if (!f.exists() System.out.println(“Creating line.txt.“); f.createNewFile(); FileOutputStream out=new FileOutputStream(f); System.out.println(“please input a line of text:“); b=System.in.read(buffer); out.write(buffer,0,b); out.close(); catch (IOException e) System.out.println(“Error in write“+e); ,FileInputStream类,构造方法 public FileInputStream(String name) throws FileNotFoundException public FileInputStream(File file) throws FileNotFoundException,创建磁盘文件的输入流对象,创建FileInputStream对象时,指定的文件应当是 存在和可读的,打开一个到某文件的输入流 try FileInputStream istream=new FileInputStream(“hello.txt”); catch (IOException e) System.out.println(“error occurred in file read!”); try File f=new File(“hello.txt”); FileInputStream stream=new FileInputStream(f); catch (IOException e) ,从输入流中读取字节 public int read() throws IOException 返回字节值,若到达源的末尾则返回-1 public int read(byte b) throws IOException 将读入的数据放在一个字节数组中,返回实际读取的字节个数,若到达源的末尾则返回-1 public int read(byte b, int off, int len) throws IOException 将读入的数据放在一个字节数组中,off是首字节在数组中的存放位置,byte fileContent=new byte20; try while (b=in.read(fileContent,0,20)!=-1) String s=new String(fileContent,0,b); System.out.println(s); catch (IOException e) ,关闭流 需要释放流所占用的系统资源 需要把流缓冲区的内容冲洗掉 java会在程序结束时自动关闭所有打开的流 对于过滤流,则把最顶层的流关闭,会自动自顶向下关闭所有流 public void close( ) throws IOException,FileOutputStream类,构造方法 public FileOutputStream(File file) throws FileNotFoundException public FileOutputStream(String name) throws FileNotFoundException public FileOutputStream(String name, boolean append),创建FileOutputStream对象时,可以指定还不存在的 文件名,不能指定一个已被其他程序打开了的文件,常用方法 public void write(byte b) throws IOException 将指定字节数组写入此文件输出流。 public void write(byte b, int off, int len) throws IOException 将指定字节数组中从偏移量 off 开始的 len 个字节写入此文件输出流。 public void write(int b) throws IOException 输出指定的字节 public void close( ) throws IOException 关闭此文件输出流并释放与此流有关的所有系统资源。 public void flush() throws IOException 刷新此输出流并强制写出所有缓冲的输出字节。,try byte buffer=new byte100; FileOutputStream out=new FileOutputStream(f); b=System.in.read(buffer); out.write(buffer,0,b); out.close(); catch (IOException e) ,如何将各种基本数据类型的数据写入文件中并依序读出显示在屏幕上?,try DataOutputStream dos=new DataOutputStream(new FileOutputStream(“4.txt”); dos.writeBoolean(true); dos.writeShort(12); dos.writeInt(100); dos.writeLong(123456); dos.writeFloat(3.1415926f); dos.writeDouble(987545321.12324); dos.writeChar(G); dos.writeUTF(“you are a teacher“); dos.close(); catch (FileNotFoundException fe) catch (IOException ioe) ,try DataInputStream dis=new DataInputStream(new FileInputStream(“4.txt”); System.out.println(dis.readBoolean(); System.out.println(dis.readShort(); System.out.println(dis.readInt(); System.out.println(dis.readLong(); System.out.println(dis.readFloat(); System.out.println(dis.readDouble(); System.out.println(dis.readChar(); System.out.println(dis.readUTF(); dis.close(); catch (FileNotFoundException fe) catch (IOException ioe) ,DataOutputStream类,将java基本数据类型的数据写到一个低层的输出流中,所写数据的方式是可移植的 既可以向输出流中写入字节,还可写入基本数据类型 构造方法 public DataOutputStream(OutputStream out) 常用方法 public final void writeBoolean(boolean v) throws IOException public final void writeByte(int v) throws IOException,public final void writeShort(int v) throws IOException public final void writeChar(int v) throws IOException public final void writeInt(int v) throws IOException public final void writeLong(long v) throws IOException public final void writeFloat(float v) throws IOException public final void writeDouble(double v) throws IOException public final void writeBytes(String s) throws IOException public final void writeChars(String s) throws IOException public final void writeUTF(String str) throws IOException public void write(byte b, int off, int len) throws IOException public void write(int b) throws IOException public void write(byte b) throws IOException java.io.FilterOutputStream,try DataOutputStream dos=new DataOutputStream(new FileOutputStream(“4.txt”); dos.writeBoolean(true); dos.close( ); catch ( FileNotFoundException e ) catch (IOException ioe ) ,基本框架,DataInputStream类,应用程序以与机器无关的方式从低层输入流中读取Java基本数据类型的数据 既可以读取字节,还可以读取基本类型数据和文本行 构造方法 public DataInputStream(InputStream in) 常用方法 public final boolean readBoolean() throws IOException public final String readLine() throws IOException public final byte readByte() throws IOException public final char readChar() throws IOException,public final int readInt() throws IOException public final long readLong() throws IOException public final float readFloat() throws IOException public final double readDouble() throws IOException public final String readUTF() throws IOException public final int readUnsignedByte() throws IOException public final int readUnsignedShort() throws IOException public final int skipBytes(int n) throws IOException public final int read(byte b) throws IOException public final int read(byte b, int off, int len) throws IOException public int read() throws IOException java.io.FilterInputStream public final void readFully(byte b) throws IOException,为什么DataInputStream类中有一个readUTF方法,而没有readChars和readBytes方法呢?,try DataInputStream dis=new DataInputStream(new FileInputStream(“4.txt”); System.out.println(dis. readBoolean( ) ); dis.close( ); catch ( FileNotFoundException e ) catch (IOException ioe ) ,基本框架,每一字节的读写都要涉及对磁盘的直接操作,如何减少对磁盘的读写次数以提高效率呢?,使用缓冲流,试比较采用缓冲和非缓冲策略向文件中写入及从文件中读出100000个double数的效率,缓冲流为I/O流增加了内存缓冲区,增加缓冲区有两个基本目的: 允许Java程序一次不只操作一个字节,提高了程序的性能 由于有了缓冲区,使得在流上执行skip、mark和reset方法都成为可能 这两个类在自己的实例对象中创建缓冲区,流缓冲区与底层缓冲区的区别 底层缓冲区读写数据是批量的 流缓冲区读写数据是单个的,缓冲流类,BufferedOutputStream public BufferedOutputStream(OutputStream out) 新建一个默认大小的缓冲流。缓冲输出流收集写入的字符以避免每次都引起对设备的访问。当缓冲区满或流被刷新时,数据被写入设备。 public void flush( ) throws IOException 刷新此缓冲的输出流。这迫使所有缓冲的输出字节被写 到底层输出流中。,public void write(byte b, int off, int len) throws IOException,public void write(int b) throws IOException,public BufferedOutputStream(OutputStream out, int size) public BufferedInputStream(InputStream in, int size),BufferedInputStream public BufferedInputStream(InputStream in) 新建一个默认大小的缓冲流。缓冲的输入流从一 个流中读取字符,而不会每次都引起对设备的访问。 当缓冲区空时,一个新的数据块将被读入缓冲区。,缓冲流把数据从原始流成块读入或把数据积累到一个 大数据块后再成批写出,通过减少系统资源的读写次 数来加快程序的执行。,public int read(byte b, int off, int len) throws IOException,public int read() throws IOException,public BufferedInputStream(InputStream in, int size),基本框架,DataOutputStream dos=new DataOutputStream(new BufferedOutputStream(new FileOutputStream(“4.txt”); dos.close( );,DataInputStream dis=new DataInputStream(new BufferedInputStream(new FileInputStream(“4.txt”); dis.close( );,如何以字符形式向文件写入数据和从文件读出数据?,程序,文件,FileWriter 对象,BufferedWriter 对象,程序,文件,FileReader 对象,BufferedReader 对象,字符输入流,过滤器输入流,缓冲输入流,管道输入流,字节数组输入流,字符串输入流,BufferedReader,LineNumberReader,FilterReader,PushbackReader,InputStreamReader,FileReader,行编号输入流,回压输入流,文件输入流,字符串输出流,字节数组输出流,格式化输出流,管道输出流,缓冲输出流,过滤器输出流,字符输出流,文件输出流,Writer中的方法 public void write(char cbuf) throws IOException public abstract void write(char cbuf, int off, int len) throws IOException public void write(String str) throws IOException public void write(String str, int off, int len) throws IOException public void write(int c) throws IOException,Reader中的方法 public int read() throws IOException public int read(char cbuf) throws IOException public abstract int read(char cbuf, int off, int len) throws IOException,FileReader和FileWriter 用来读出和写入字符文件的便捷类。 BufferedReader和BufferedWriter BufferedWriter将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 BufferedReader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。,InputStreamReader类 public InputStreamReader(InputStream in),InputStreamReader in=new InputStreamReader (System.in);,二进制文件与文本文件的区别,在内存中都以二进制的形式存储 要表示字符的字节是特殊的,不能是任意的 如果一个文本中的每个字节或每相邻若干字节都可以表示成字符,就是文本文件 文本文件是二进制文件的一种特例 如果一个文件专用于存储文本字符,没有包含字符以外的数据,称为文本文件,例:创建一个简单的文本编辑工具,能在文本区中打开指定的文件,并能在指定文件中保存文本区中内容,public class TextViewerExp extends JFrame implements ActionListener private JMenu fileMenu=new JMenu(“File“); private JMenuItem fileOpen=new JMenuItem(“Open“); private JMenuItem fileSave=new JMenuItem(“Save“); private JMenuItem fileExit=new JMenuItem(“Exit“); private JTextArea text=new JTextArea(); private JFileChooser fileDialog;,public TextViewerExp() super(“Text Viewer“); fileMenu.add(fileOpen); fileOpen.addActionListener(this); fileMenu.add(fileSave); fileSave.addActionListener(this); fileMenu.addSeparator(); fileMenu.add(fileExit); fileExit.addActionListener(this); JMenuBar menu=new JMenuBar(); menu.add(fileMenu); setJMenuBar(menu); setLayout(new BorderLayout(); add(new JScrollPane(text),BorderLayout.CENTER); setSize(400,400); setVisible(true); ,public void readFile(String file) text.setText(“); try BufferedReader in=new BufferedReader(new FileReader(file); String line; while (line=in.readLine()!=null) text.append(line+“n“); in.close(); text.setCaretPosition(0); catch (IOException ioe) System.err.println(ioe); ,pu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论