java输入输出--字节流处理_输入输出流最大字节数java-程序员宅基地

技术标签: java  

字节流类为处理字节式输入输出提供了丰富的环境。

InputStream/OutputStream

InputStream 是一个定义了 Java 字节流输入模式的抽象类。 该类的所有方法在出错条件下都将引发一个 IOException 异常。其声明格式如下:

public abstract class InputStream extends Object implements Closeable

InputStream 类继承了 Object 类, 实现了 Closeable 接口,该接口是 Java 5.0 新增的接口,定义了一个 close() 方法,通过调用该方法,可以释放流所占用的资源。

InputStream 的方法

方法 描述
int available() 返回当前可读的输入字节数
void close() 关闭输入源。关闭之后的读取会产生 IOException 异常
void mark(int readlimit) 在输入流的当前点放置一个 标记。该流在读取 readlimit 个字节前都保持有效
boolean markSupported() 如果调用的流支持 mark()/reset() 就返回 true
int read() 如果下一个字节可读则返回一个整型,遇到文件尾时返回 -1
int read(byte b[]) 试图读取 b.length 个字节到 b 中,并返回实际成功读取的字节数。遇到文件尾时返回 -1
int read(byte b[], int offset, int len) 试图读取 len 字节到 b 中,从 offset 开始存放,返回实际读取的字节数。遇到文件尾时返回 -1
void reset() 重新设置输入指针到先前设置的标志处
long skip(long n) 跳过 n 个输入字节,返回实际跳过的字节数

OutputStream 是定了字节流输出模式的抽象类。该类的所有方法都返回一个 void值,并且在出错情况下引发一个 IOException 异常。其声明格式如下:

public abstract class OutputStream extends Object implements Closeable, Flushable

OutputStream 继承了 Object 方法,实现了 Closeable 和 Flushable 接口。 Flushable 接口中定义了一个方法 flush(), 调用该方法会输出缓冲区中的数据。

OutputStream 的方法

方法 描述
void close() 关闭输出流,关闭后的写操作会产生 IOException 异常
void flush() 刷新缓冲区
void write(int b) 向输出流写入单个字节。注意参数是一个整型数,它允许不必把参数转换成字节型就可以调用 write(), 但是输出有效值为 b 的低 8 位,高 24 位被舍弃
void write(byte b[]) 向一个输出流写一个完整的字节数组
void write(byte b[],int offset, int len) 输出数组 b 以 b[offset] 为起点的 len 个字节区域内的内容

标准输入输出流

标准输入输出指在字符方式下,程序与系统进行交互的方式,分为 3 种:

  • 标准输入 stdin , 对象是键盘。
  • 标准输出 stdout , 对象是屏幕。
  • 标准错误输出 stderr, 对象也是屏幕。

Java 通过系统类 System 实现标准输入输出的功能,定义了 三个流变量: in、out 和 err。这些成员在 System 中时被定义成 pulbic 和 static 型的,这意味着他们可以直接通过 Systetm 类进行调用。其声明格式如下:

public static PrintStream err
public static PrintStream out
public static InputStream in

标准输入

System.in 作为字节输入流类 InputStream 的对象实现标准输入,通过 read() 方法从键盘接收数据。

int read();
int read(byte b[]);
int read(byte b[], int offset, int len);

从标准输入读取数据

import java.io.IOException;
public class FileDemo {
    public static void main(String[] args) throws IOException {
        System.out.println("input: ");
        byte b[] = new byte[512];
        int count = System.in.read(b);
        System.out.println("Output: ");
        for (int i = 0; i < count; i++){
            System.out.print( b[i] + " ");
        }
        System.out.println(" ");
        for(int i = 0; i < count; i++){
            System.out.print((byte)b[i] + " ");
        }
        System.out.println("cout = " + count);
    } 
}

// input: 
// abcd
// Output:
// 97 98 99 100 10  
// 97 98 99 100 10 cout = 5

标准输出

System.out 作为打印流类 PrintStream 的对象实现标准输出。其中定义了 print 和 println 方法,支持 Java 任意基本类型作为参数。

public void print(int i);
public void println(int i);

两种区别在于, print ln 在输出时加一个回车换行符。
在使用 PrintStream 的方法时,不会抛出 IOException,可以使用 checkError() 检查流的状态,在使用其输出字符时,被转换成字符。

Java 5.0 对 PrintStream 类进行了扩充,支持数据的格式化输出, 增加了 printf() 方法。

public PrintStream printf(String format, Object... args);
public PrintStream printf(Locale l, String format, Object...args);

这两种方法都使用了 Java 5.0 中增加的功能, 支持可变参数,即方法的参数个数是可变的。 format 参数指明输出个数,args 是输出参数列表, l 是地区设置。

format 字符串的格式是:

%[argument_index $][flags][width][.precision]conversion

argument_index 用十进制整数表示参数列表中的位置,第一个参数用 1$表示,第二个参数用 2$ 表示,以此类推; flags 是调整输出格式的字符集合; width 是一个非负整数,表示输出的最小字符数, precision 是一个非负整数,用于限制字符个数; conversion 是一个字符,表示参数被如何格式化。

conversion 被分成 6 类:

  1. General ,应用于任何参数类型。
  2. Character,应用于可以表示 Unicode 字符的基本数据类型,如 char, byte, short,int
    等。还有他们的包装器类型。
  3. Number 又可以分为 Integer 和 Float Point ,应用于 Java 的数字类型。
  4. Data/Time,应用于日期,long ,Calendar、Date 是表示日期的类型。
  5. Percent ,在数字上增加一个 %。
  6. Line Separator ,产生一个平台相关的行分隔符。

具体的转化字符(conversion)表示如下。大部分转化字符有 大写和 小写 两种形式。

字符 类型 描述
‘b’,’B’ general 如果参数 arg 是 null,则输出结果是 false,如果 arg 是 boolean 或者 Boolean,则输入结果是 String.valueOf(),否则结果是 true
‘h’,’H’ general 如果 arg 是 null, 则结果是 null,否则结果等于 Integer.toHexString
’s’,’S’ general 如果 arg 是 null,则结果是 null;如果 arg 实现了 Formattable,那么结果相当于 arg.formatTo,否则结果相当于 arg.toString()
‘c’,’C’ character 结果是 Unicode 字符
‘d’ integral 十进制整数
‘o’ integral 八进制整数
‘x’,’X’ integral 十六进制整数
‘e’,’E’ floating point 用科学计数法表示
‘f’ floating point 十进制数
‘g’,’G’ floating point 用科学记数法 或十进制整数表示,与数字的精度,舍入有关系
‘a’,’A’ floating point 带有指数的十六进制浮点数
‘t’,’T’ date/time 使用时间格式字符的前缀
‘%’ percent 转化成百分数
‘n’ line separator 平台相关的行分隔符

日期/时间 转化符如下, 在使用时需要加前缀 t 或 者 T。

字符 描述
‘H’ 24 小时制,用两位字符表示,如 00~23
‘I’ 12 小时制,用两位字符表示,如 00~12
‘k’ 24 小时制,如 0~23
‘l’ 12 小时制,如 1~12
‘M’ 用两位数字表示的分,如 00~59
‘S’ 用两位数字表示的秒,如 00~60
‘L’ 3位数字表示的毫秒,如 000~999
‘N’ 9位数字表示的纳秒,如 000 000 000 ~999 999 999
‘p’ 用字母表示 上午 或 下午,如 am 或 pm 。使用 T 前缀转化为大写,即 AM 或 PM
‘z’ 时区,如-0800
‘Z’ 时区的简化字符串表示
’s’ 从 1970-1-1 00:00:00 UTC 开始的秒数,如 Long.MIN_VALUE/1000 to Long.MAX_VALUE/1000
‘Q’ 从 1970-1-1 00:00:00 UTC 开始的毫秒数,如 Long.MIN_VALUE/1000 to Long.MAX_VALUE/1000

标识符和表示符支持的参数类型如下图,y 表示 支持

符号 General Character Integral Floating Point Date/Time 描述
‘-‘ y y y y y 左对齐
‘#’ y - y y - 依赖于转化符的格式
‘+’ - - y y - 总是显示符号
- - y y - 对整数加前导空格
‘0’ - - y y - 结果用 0 填补
‘,’ - - y y - 本地化千位分隔符
‘(‘ - - y y - 负数显示在括号中

格式化输出

import java.util.Calendar;
import java.util.Date;
public class FileDemo {
    public static void main(String[] args)  {
        Calendar c = Calendar.getInstance();
        Date d = new Date();
        double d1 = -234.567;
        c.add(Calendar.DATE,2);

        // 格式化日期
        System.out.printf("%1$Tc is after %n %2$TF %2$Tr %n",c,d);

        //格式化数字
        System.out.printf("%1$ (4.9e\n",d1);
        System.out.printf("%1$+4.9G",d1);
    } 
}
// THU JUL 12 23:57:02 CST 2018 is after 
//   2018-07-10 11:57:02 PM 
// (2.345670000e+02)
// -234.567000

文件字节流

InputStream 和 OutputStream 都是抽象类,不能实例化,因此在实际应用中都使用的是它们的子类,这些子类在实现其超类方法的同时又定义了特有的功能,用于不同的场合。

文件数据流类 FileInputStream 和 FileOutputStream 用于进行文件的输入输出处理,其数据源和接收器都是文件。

FileInputStream

FileInputStream 用于顺序访问本地文件,从超类继承 read,close 等方法,对文件进行操作,不支持 mark 方法 和 reset 方法。它的两个常用的构造函数如下:

FileInputStream(String filePath);
FileInputStream(File fileObj);

它们都能引发 FileNotFoundException 异常。这里,filePath 是文件的全称路径, fileObj 是描述该文件的 File 对象。 可以用下面的代码构造文件输入流:

FileInputStream f1 = new FileInputStream("Test.java");
File f = new File("Test.java");
FileInputStream f2 = new FileInputStream(f);

FileInputStream 重写了抽象类 InputStream 的读取数据的方法:

public int read() throws IOException
public int read(byte[] b) throws IOException
public int read(byte[] b, int off, int len) throws IOException

这些方法在读取数据时,输入流结束则返回 -1

FileOutputStream

FileOutputStream 用于向一个文本文件写数据。 它从超类中继承 write,close 等方法。它常用的构造函数如下:

FileOutputStream(String filePath);
FileOutputStream(File fileObj);
FileOutputStream(String filePath, boolean append);
FileOutputStream(File fileObj, boolean append);

它们可以引发 IOException 或 SecurityException 异常。这里 filePath是文件的全称路径,fileObj 是描述该文件的 File对象。如果 append 为 true, 则文件以追加的方式打开,不覆盖已有文件的内容,如果为 false,则覆盖原文的内容。

FileOutputStream 的创建不依赖于文件是否存在。如果 filePath表示的文件不存在,则 FileOutputStream 在打开之前创建它;如果文件已经存在,则打开它,准备写。 若 试图打开一个只读文件,会引发一个 IOException 异常。

FileOutputStream 重写了抽象类 OutputStream 的写数据的方法:

public void write(byte[] b) throws IOException
public void write(byte[] b,int off, int len) throws IOException
public void write(int b) throws IOException

b 是 int 类型时,占用 4 个字节, 只有最低的一个字节被写入输出流,忽略其余字节。

文件复制程序

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileDemo {
    public static void main(String[] args) throws IOException  {
        int size;
        FileInputStream f = new FileInputStream("D:\\JAVA\\Java File\\FileDemo.class");
        FileOutputStream fout = new FileOutputStream("copy-of-file.txt");

        System.out.println("Total Available Bytes:" + (size = f.available()));
        int n = size/30;
        System.out.println("First " + n + "bytes of the file one read() at a time");
        for (int i = 0; i < n; i++){
            fout.write(f.read());
        }
        System.out.println("Still Available: " + f.available());


        System.out.println("Reading the next " + n + "with one read(b[])");
        byte b[] = new byte[n];
        if(f.read(b) != n){
            System.out.println("couldn't read " + n + "bytes");

        }
        fout.write(b);
        System.out.println("Still Available:" + f.available());

        System.out.println("Reading the rest bytes with read(b[],offset,len)");
        int count = 0;
        while((count = f.read(b, 0, n)) != -1){
            fout.write(b,0,count);
        }
        System.out.println("Still Available:" + f.available());

        f.close();
        fout.flush();
        fout.close();

    } 
}
// Total Available Bytes:2465
// First 82bytes of the file one read() at a time
// Still Available: 2383
// Reading the next 82with one read(b[])
// Still Available:2301
// Reading the rest bytes with read(b[],offset,len)
// Still Available:0

过滤流

过滤流在读/写数据的同时可以对数据进行处理,它提供了同步机制,使得在某一时刻只有一个线程可以访问 I/O 流,以防止多个线程同时对一个 I/O 流进行操作所带来的意想不到的结果。

这些过滤字节流是 FilterInputStream 和 FilterOutputStream。它们的构造函数如下:

FilterOutputStream(OutputStream os);
FilterInputStream(InputStream is);

为了使用一个过滤流,必须首先把过滤流连接到某个输入输出流,过滤在构造方法的参数中指定所要连接的输入输出流来实现。

过滤流扩展了输入输出流的功能,典型的扩展是缓冲,字符字节转换和数据转换。为了提高数据的传输效率,为一个流配备缓冲区(Buffer),称为缓冲流。

当向缓冲流写入数据是,系统将数据发送到缓冲区,而不是直接发送到外部设备,缓冲区自动记录数据。当缓冲区满时,系统将数据全部发送到设备。

当从一个缓冲流中读取数据时,系统实际是从缓冲区中读取数据的。当缓冲区空时,系统会自动从相关设备读取数据,并读取尽可能多的数据充满缓冲区。

因为有缓冲区可用, 缓冲流支持跳过(skip)、标记(mark)、和重新设置(reset)等方法。

常用的缓冲输入流有 BufferedInputStream、 DataInputStream
PushbackInputStream、常用的缓冲输出流有 BufferedOutputStream, DataOutputStream, PrintStream。

1. BufferedInputStream / BufferedOutputStream

缓冲输入输出是一个非常普通的性能优化。 Java 的 BufferedInputStream 类允许把任何 InputStream 类“包装” 成缓冲流并使它的性能提高 。BufferedInputStream 有两个构造函数:

BufferedInputStream(InputStream inputStream);
BufferedInputStream(InputStream inputStream, int bufSize);

第一种 形式生成了 一个默认缓冲区长度的缓冲流 。
第二种形式缓冲区 大小时由 bufSize 传入的。使用内存页 或磁盘块等的若干倍的缓冲区大小可以给执行性能带来很大的正面影响。但这是依赖于执行情况的。 最理想的缓冲长度一般与主机操作系统,可用内存空间及机器配置有关。合理利用缓冲不需要特别复杂的操作,一般缓冲大小为 8192 字节。用这样的方法,低级系统可以从磁盘或网络读取数据块并在缓冲区中存储结果。

BufferedInputStream.markSupported() 返回 true。BufferedInputStream 支持 mark() 和 reset() 方法。

BufferdOutputStream 用一个 flush() 方法来保证数据缓冲区被写入到实际的输出设备。因为 BufferedOutputStream 是通过减小系统写数据的时间而提高性能的,可以调用 flush() 方法输出缓冲区中待写的数据。

下面是两个可用的构造函数:

BufferedOutputStream(OutputStream outputStream);
BufferedOutputStream(OutputStream outputStream, int bufSize);

第一种形式创建了一个使用 512 字节缓冲区的缓冲流。 第二种形式,缓冲区的大小由 bufSize 参数传入。

一般使用缓冲流来实现文件的复制。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileDemo {
    public static void main(String[] args) throws IOException  {
        int size;
        FileInputStream f = new FileInputStream("D:\\JAVA\\Java File\\FileDemo.class");
        FileOutputStream fout = new FileOutputStream("D:\\JAVA\\Java File\\copy-of-file.txt");
        BufferedInputStream bis = new BufferedInputStream(f);
        BufferedOutputStream bos = new BufferedOutputStream(fout);
        System.out.println("Total Avaiable Bytes:"+(size = bis.available()));

        int n = size / 30;
        System.out.println("First " + n + "bytes of the file one read() at a time");
        for(int i = 0; i< n; i++){
    
            bos.write(bis.read());
        }
        System.out.println("Still Available: " + bis.available());

        System.out.println("Reading the next " + n +" with one read(b[])");
        byte b[] = new byte[n];
        if(bis.read(b) != n){
            System.err.println("couldn't read " + n +"bytes");
        }
        bos.write(b);
        System.out.println("Still Available: " + bis.available());

        System.out.println("Reading the rest bytes with read(b[], offset, len)");
        int count = 0;
        while ((count = bis.read(b,0,n)) != -1){
            bos.write(b, 0, count);
        }
        System.out.println("Still Available: " + bis.available());

        bis.close();
        bos.flush();
        bos.close();
        f.close();
        fout.flush();
        fout.close();
    } 
}
// Total Avaiable Bytes:2465
// First 82bytes of the file one read() at a time
// Still Available: 2383
// Reading the next 82 with one read(b[])
// Still Available: 2301
// Reading the rest bytes with read(b[], offset, len)
// Still Available: 0

2.DataInputStream / DataOutputStream

DataInputStream 和 DataOutputStream 不仅能使用一般的 read() 方法读取数据流,一般的write() 方法写数据流, 而且能直接读/写各种各样的 java 语言的基本数据类型: 如 boolean、int、float、double 等。这些基本数据类型文件中的表示方式和他们在内存中的一样,无须多余的转换工程。

DataInputStream 的构造函数如下:

// 需要使用其他输入流作为参数,这里可用 FileInputStream。
public DataInputStream(InputStream in) 

DataOutputStream 的构造函数如下:

// 需要使用其他流作为参数,这里可用 FileOutputStream。
public DataOutputStream(OutputStream out); 

随机存取文件

对于 InputStream 和 OutputStream 它们都是顺序访问流,从头至尾访问流,并且输入流只能读,不能写,输出流只能写不能读,即对一个文件不能同时进行读写。

RandomAccessFile 类提供了一个称为 “随机访问文件”的方式,可以:对一个文件同时进行读写操作。
可以在文件的任意位置进行读写操作。

1:声明和构造函数
RandomAccessFile 的声明如下:

public calss RandomAccessFile extends Objects implements DataInput、DataOutput、Closeable

RandomAccessFile 包装了一个随机访问的文件,它不是派生于InputStream 和 OutputStream 而是直接继承于 Object 实现定义了基本输入输出方法的 DataInput 和 DataOutput 接口。 可以在文件内部放置文件指针。它有两个构造函数:

RandomAccessFile(String name, String mode) throws FileNotFoundException;
RandomAccessFile(File file, String mode) throws FileNotFoundException;

其中 ,file 识别文件路径,mode 指定参数访问模式; r 表示读,w 表示写, rw 表示读写。当文件不存在是,构造方法将抛出 FileNotFoundException。

主要的方法:

方法 描述
public long length() 返回文件的长度。
void setLength(long newLength) 设置文件的新长度。
public void seek(long pos) 改变文件指针位置
public final int readInt() 读入一个整数类型,因为其实现了DataInput接口,在读取数据的能力上 和 DataInputStream 相同,可以使用 readDouble() 等
public final void writeInt(int v) 写入一个整数,因其实现了 DataOutput 接口,写数据的能力 和 DataOutputStream相同
public long getFilePointer() 获取文件指针位置
public int skipBytes(int n) 跳过 n 个字节
close() 关闭文件
import java.io.*;
public class FileDemo {
    public static void main(String[] args) {
        String filename = "raf.txt";
        RandomAccessFile raf = null;
        String str1 = "this is a file";
        String str3 = "中华人民共和国";
        long length;
        long pos;
        try{
            raf = new RandomAccessFile(filename,"rw");
            raf.writeChars(str1);
            pos = raf.getFilePointer();
            length = str1.length();
            System.out.println("第一个字符串的长度为:" + length);

            // 一个字符用两个字节表示,内存中的表示和文件中的表示一致
            System.out.println("写入第一个字符串后,文件指针:" + pos);

            System.out.println("第二个字符串:");
            pos = raf.getFilePointer();
            raf.writeChars(str3);
            raf.seek(pos);
            for (int i = 0; i < str3.length(); i++){
                System.out.print(raf.readChar());
            }
            pos = raf.getFilePointer();

            System.out.println("\n写入" + str3.length() +"字符后,文件指针:" + pos);
            System.out.println("文件测试成功");
        }catch(FileNotFoundException e){
            System.out.println("文件不存在");
        }catch(IOException e){

        }
    } 
}
// 第一个字符串的长度为:14
// 写入第一个字符串后,文件指针:28
// 第二个字符串:
// 中华人民共和国
// 写入7字符后,文件指针:42
// 文件测试成功

其它字节流

1:ByteArrayInputStream / ByteArrayOutputStream

ByteArrayInputStream 是吧字节 数组当成源的输入流。 该类有两个构造函数,每个构造函数需要一个字节数组提供数据源:

ByteArrayInputStream(byte b[]);
ByteArrayInputStream(byte[] b, int offset, int len);

这里, b 是输入源。 第二个构造函数从字节数组的子集构造输入流, 以 offset 指定索引的字符为起点,长度有 len 决定 。

ByteArrayInputStream 实现了 mark() 和 reset() 方法。

ByteArrayOutputStream 把字节数组当做输出流。ByteArrayOutputStream 有两个构造函数:

ByteArrayOutputStream();
ByteArrayOutputStream(int n);

第一个构造函数生成了一个 32 位字节的缓冲区。 第二个构造函数生成了一个大小为 n 的缓冲区 。缓冲区保存 在 ByteArrayOutputStream 的受保护的 buf 成员中 。缓冲区的大小在需要的情况下会自动增加 。缓冲区保存的字节数是由 ByteArrayOutputStream 的受保护的 count 域保存的。

2.SequenceInputStream

SequenceInputStream 类允许连接多个 InputStream 流。SequenceInputStream 的构造不同于任何其他的 InputStream。SequenceInputStream 构造函数要么使用一对 InputStream,要么用 InputStream 的一个 Enumeration ,显示如下:

SequenceInputStream(InputStream first, InputStream second);
SequenceInputStream(Enumeration streanEnum);

从操作上来说,该类满足读取完第一个 InputStream 后转去读取第二个 流的要求。在使用 Enumeration 的情况下,它将继续读取所有 Inputstream 流,直到最后一个被读完。

3.PushbackInputStream

缓冲流的一个新颖的用法是实现退回(Pushback),PushbackInputStream 允许字节被读取然后再退回到流。
PushbackInputStream 构造函数:

PushbackInputStream(InputStream in);
PushbackInputStream(InputStream in ,int size);

这种能够把字节退回到流的功能在统计一个文件的单词个数时非常有用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/daicooper/article/details/80979571

智能推荐

Linux查看登录用户日志_怎么记录linux设备 发声的登录和登出-程序员宅基地

文章浏览阅读8.6k次。一、Linux记录用户登录信息文件1  /var/run/utmp----记录当前正在登录系统的用户信息;2  /var/log/wtmp----记录当前正在登录和历史登录系统的用户信息;3  /var/log/btmp:记录失败的登录尝试信息。二、命令用法1.命令last,lastb---show a listing of la_怎么记录linux设备 发声的登录和登出

第四章笔记:遍历--算法学中的万能钥匙-程序员宅基地

文章浏览阅读167次。摘要:1. 简介 2. 公园迷宫漫步 3. 无线迷宫与最短(不加权)路径问题 4. 强连通分量1. 简介在计算机科学裡,树的遍历(也称为树的搜索)是圖的遍歷的一种,指的是按照某种规则,不重复地访问某种樹的所有节点的过程。具体的访问操作可能是检查节点的值、更新节点的值等。不同的遍历方式,其访问节点的顺序是不一样的。两种著名的基本遍历策略:深度优先搜索(DFS) 和 广度优先搜索(B...

【案例分享】使用ActiveReports报表工具,在.NET MVC模式下动态创建报表_activereports.net 实现查询报表功能-程序员宅基地

文章浏览阅读591次。提起报表,大家会觉得即熟悉又陌生,好像常常在工作中使用,又似乎无法准确描述报表。今天我们来一起了解一下什么是报表,报表的结构、构成元素,以及为什么需要报表。什么是报表简单的说:报表就是通过表格、图表等形式来动态显示数据,并为使用者提供浏览、打印、导出和分析的功能,可以用公式表示为:报表 = 多样的布局 + 动态的数据 + 丰富的输出报表通常包含以下组成部分:报表首页:在报表的开..._activereports.net 实现查询报表功能

Ubuntu18.04 + GNOME xrdp + Docker + GUI_docker xrdp ubuntu-程序员宅基地

文章浏览阅读6.6k次。最近实验室需要用Cadence,这个软件的安装非常麻烦,每一次配置都要几个小时,因此打算把Cadence装进Docker。但是Cadence运行时需要GUI,要对Docker进行一些配置。我们实验室的服务器运行的是Ubuntu18.04,默认桌面GNOME,Cadence装进Centos的Docker。安装Ubuntu18.04服务器上安装Ubuntu18.04的教程非常多,在此不赘述了安装..._docker xrdp ubuntu

iOS AVFoundation实现相机功能_ios avcapturestillimageoutput 兼容性 ios17 崩溃-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏2次。首先导入头文件#import 导入头文件后创建几个相机必须实现的对象 /** * AVCaptureSession对象来执行输入设备和输出设备之间的数据传递 */ @property (nonatomic, strong) AVCaptureSession* session; /** * 输入设备 */_ios avcapturestillimageoutput 兼容性 ios17 崩溃

Oracle动态性能视图--v$sysstat_oracle v$sysstat视图-程序员宅基地

文章浏览阅读982次。按照OracleDocument中的描述,v$sysstat存储自数据库实例运行那刻起就开始累计全实例(instance-wide)的资源使用情况。 类似于v$sesstat,该视图存储下列的统计信息:1>.事件发生次数的统计(如:user commits)2>._oracle v$sysstat视图

随便推点

Vue router报错:NavigationDuplicated {_name: "NavigationDuplicated", name: "NavigationDuplicated"}的解决方法_navigationduplicated {_name: 'navigationduplicated-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏9次。我最近做SPA项目开发动态树的时候一直遇到以下错误:当我点击文章管理需要跳转路径时一直报NavigationDuplicated {_name: “NavigationDuplicated”, name: “NavigationDuplicated”}这个错误但是当我点击文章管理后,路径跳转却是成功的<template> <div> 文章管理页面 <..._navigationduplicated {_name: 'navigationduplicated', name: 'navigationduplic

Webrtc回声消除模式(Aecm)屏蔽舒适噪音(CNG)_webrtc aecm 杂音-程序员宅基地

文章浏览阅读3.9k次。版本VoiceEngine 4.1.0舒适噪音生成(comfort noise generator,CNG)是一个在通话过程中出现短暂静音时用来为电话通信产生背景噪声的程序。#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)static const EcModes kDefaultEcMode = kEcAecm;#elsestati..._webrtc aecm 杂音

医学成像原理与图像处理一:概论_医学成像与图像处理技术知识点总结-程序员宅基地

文章浏览阅读6.3k次,点赞9次,收藏19次。医学成像原理与图像处理一:概论引言:本系列博客为医学成像原理与图像处理重要笔记,由于是手写,在此通过扫描录入以图片的形式和电子版增补内容将其进行组织和共享。前半部分内容为图像处理基础内容,包括图像的灰度级处理、空间域滤波、频率域滤波、图像增强和分割等;后半部分内容为医学影象技术,包括常规胶片X光机、CR、DR、CT、DSA等X射线摄影技术、超声成像技术、磁共振成像(MRI)技术等。本篇主要内容是概论。_医学成像与图像处理技术知识点总结

notepad++ v8.5.3 安装插件,安装失败怎么处理?下载进度为0怎么处理?_nodepa++-程序员宅基地

文章浏览阅读591次,点赞13次,收藏10次。notepad++ v8.5.3 安装插件,下载进度为0_nodepa++

hive某个字段中包括\n(和换行符冲突)_hive sql \n-程序员宅基地

文章浏览阅读2.1w次。用spark执行SQL保存到Hive中: hiveContext.sql(&quot;insert overwrite table test select * from aaa&quot;)执行完成,没报错,但是核对结果的时候,发现有几笔数据超出指定范围(实际只包含100/200)最终排查到是ret_pay_remark 字段包含换行符,解决方案:执行SQL中把特殊字符替换掉regexp_replace(..._hive sql \n

印象笔记05:如何打造更美的印象笔记超级笔记_好的印象笔记怎么做的-程序员宅基地

文章浏览阅读520次,点赞10次,收藏8次。印象笔记05:如何打造更美的印象笔记超级笔记本文介绍印象笔记的具体使用,如何打造更美更实用的笔记。首先想要笔记更加好看和实用,我认为要使用超级笔记。所谓超级笔记就是具有很多便捷功能的笔记。_好的印象笔记怎么做的

推荐文章

热门文章

相关标签