`
m635674608
  • 浏览: 5053314 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

print打印字符串之谜

    博客分类:
  • java
 
阅读更多

string 中维护了一个char数组的value值,打印的时候也就是打印的这个数组的值。但是print(str)参数为string类型

 

看print的源码

 

   /**
     * Prints a String and then terminate the line.  This method behaves as
     * though it invokes <code>{@link #print(String)}</code> and then
     * <code>{@link #println()}</code>.
     *
     * @param x  The <code>String</code> to be printed.
     */
    public void println(String x) {
	synchronized (this) {
	    print(x);
	    newLine();
	}
    }

    public void print(String s) {

	if (s == null) {
	    s = "null";
	}
	write(s);
    }

    private void write(String s) {

	try {
	    synchronized (this) {
		ensureOpen();
		textOut.write(s);//java.io.BufferedWriter.write(s)
		textOut.flushBuffer();
		charOut.flushBuffer();//java.io.OutputStreamWriter.flushBuffer();
		if (autoFlush && (s.indexOf('\n') >= 0))
		    out.flush();
	    }
	}

 //在看看write方法调用了getChars方法,这是输出string,char数组值的关键

 public void write(String s, int off, int len) throws IOException {
	synchronized (lock) {
	    ensureOpen();

	    int b = off, t = off + len;
	    while (b < t) {
		int d = min(nChars - nextChar, t - b);
		s.getChars(b, b + d, cb, nextChar);
		b += d;
		nextChar += d;
		if (nextChar >= nChars)
		    flushBuffer();
	    }
	}
    }

   //最终调用了printStream方法的write方法

public void write(byte buf[], int off, int len) {
	try {
	    synchronized (this) {
		ensureOpen();
		out.write(buf, off, len);
		if (autoFlush)
		    out.flush();//关键在这一步调用了java.io.BufferedOutputStream的flushBuffer方法
	    }
	}
	catch (InterruptedIOException x) {
	    Thread.currentThread().interrupt();
	}
	

  java.io.BufferedOutputStream的flushBuffer方法

  /** Flush the internal buffer */最终调用了java.io.FileOutputStream..write(buf, 0, count);方法
    private void flushBuffer() throws IOException {
        if (count > 0) {
	    out.write(buf, 0, count);//java.io.FileOutputStream..write(buf, 0, count);
	    count = 0;
        }
    }

    // java.io.FileOutputStream..write最终调用了writeBytes方法

 public void write(byte b[], int off, int len) throws IOException {
	writeBytes(b, off, len);
    }

  //writeBytesa方法是本地方法最终以byte数组输出

 private native void writeBytes(byte b[], int off, int len) throws IOException;

   jdK native code

  JNIEXPORT void JNICALL

Java_java_io_FileOutputStream_writeBytes(JNIEnv *env,
    jobject this, jbyteArray bytes, jint off, jint len) {
    jboolean append = (*env)->GetBooleanField(env, this, fos_append);
    FD fd = GET_FD(this, fos_fd);
    if (fd == -1) {
        JNU_ThrowIOException(env, "Stream Closed");
        return;
    }
    if (append == JNI_TRUE) {
        if (IO_Lseek(fd, 0L, SEEK_END) == -1) {
            JNU_ThrowIOExceptionWithLastError(env, "Append failed");
        }
    }
    writeBytes(env, this, bytes, off, len, fos_fd);
}
分享到:
评论

相关推荐

    精彩编程与编程技巧-在打印字符串时自动换行...

    - **打印并更新剩余字符串**:将调整后的字符串打印,并更新待处理的字符串。 ##### 1.2 代码逻辑分析 文档中的代码片段是使用VB语言编写的。以下是对其关键部分的详细解析: ```vb Do While Len(Str) &gt; 0 str1 =...

    字符数组转换成字符串

    当我们使用`printf`的`%s`格式化字符串时,它会找到开头的字符直到遇到'\0',从而正确地打印出字符串。 然而,在实际应用中,有时我们需要动态地填充字符数组,然后将其转换为字符串。例如,我们可以从用户输入或...

    有一个字符串,内有若干个字符,今输入一个字符,要求程序将字符串中该字符删去。用外部函数实现。

    3. **函数调用**:`enter_string(str)`函数用于获取用户输入的字符串,`scanf("%c",&c)`用于读取用户要删除的字符,`delete_string(str,c)`函数执行删除操作,`print_string(str)`打印处理后的字符串。 4. **函数...

    python实现字符串模糊匹配

    Python 实现字符串模糊匹配 Python 是一种流行的编程语言,具有强大的字符串处理能力。字符串模糊匹配是字符串处理中的一种重要技术,用于解决字符串之间的相似度计算问题。在本文中,我们将介绍 Python 实现字符串...

    判断字符串是否中心对称

    print("字符串是中心对称的。") else: print("字符串不是中心对称的。") ``` 在这个程序中,`is_palindrome`函数接收一个字符串`s`,然后用双指针法检查其是否为回文。`input`函数用于获取用户输入的字符串,根据...

    在打印字符串时自动换行

    ### 在打印字符串时自动换行 #### 知识点概览 本文主要介绍了一种在打印字符串时实现自动换行的技术方法,该方法特别适用于VB(Visual Basic)环境下的编程需求。通过分析提供的部分代码片段,我们可以深入探讨其...

    字符串操作代码入门python

    Python 中的字符串操作是编程语言的基础知识之一,字符串是 Python 中最常用的数据类型之一。本文将通过实例代码,详细介绍 Python 中字符串操作的基础知识,包括字符串的基本操作、索引、切片、连接、分割、查找、...

    字符串转ASCII ASCII转字符串

    在计算机科学中,字符编码是将字符转换成数字表示的过程,而ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是最基础的字符编码系统之一。它使用7位二进制数来表示128种不同的...

    随机生成32位字符串

    4. **返回结果**:最后,`randomString`变量中就包含了32位的随机字符串,你可以将其打印出来或者用于其他目的。 ```vb Debug.Print(randomString) ``` 以上就是在VB中生成32位随机字符串的基本方法。这种方法可以...

    fortran分割字符串和字符串替换的子程序_Fortran_

    对于处理字符串操作,Fortran提供了多种内置函数,但有时为了实现特定的需求,我们可能需要编写自定义的子程序。本篇将详细介绍如何在Fortran中进行字符串的分割与替换,以帮助你更好地理解和应用这些技术。 1. **...

    腾讯在线笔试题-字符串反转,以及把整个字符串逆序

    在完成代码实现后,通过 `print_log` 函数来输出处理后的结果,该函数用于在控制台上打印字符串。在 `main` 函数中,初始化字符串,调用反转函数 `rever`,最后输出反转后的字符串。 总结来说,字符串的反转和逆序...

    swift-Colors打印彩色字符串可以修改Swift中终端输出的字符串颜色

    `Colors`库正是为了解决这个问题,它允许开发者在Swift中方便地打印彩色字符串,使得终端输出更加丰富多彩。 `Colors`库是一个小巧实用的工具,通过它可以轻松实现对终端输出字符串的颜色控制,包括但不限于文本的...

    学学Python_字符串04_字符串方法02

    在Python编程语言中,字符串是数据处理中非常重要的部分,特别是在文本分析和处理任务中。本教程将深入探讨三个关键的字符串方法:`split()`、`strip()` 和 `translate()`,这些都是Python中处理字符串时非常实用的...

    vbscript Split函数用法详解(字符串转数组函数)

    这里,`Split(MyStr, "67")`将`MyStr`按"67"分割,生成数组`MyStrs`,然后遍历并打印数组中的每个子字符串。 3. 计算一组分数的平均值: ```vb 'A$() 是动态数组的声明 Dim A$(), i As Long, intB As String, s As ...

    iOS 安全接口字符串的判断

    print("字符串为空") } else { print("字符串不为空") } ``` 这种检查确保了在进一步处理之前,字符串含有有效内容。 2. **字符串长度是否为0** 通过`length`属性,我们可以直接判断字符串的长度是否为0,这...

    统计字符串中“子字符串”的个数

    在编程领域,统计一个字符串中特定子字符串的出现次数是一个常见的任务,这涉及到字符串处理和算法的知识。在本文中,我们将深入探讨几种方法来解决这个问题,以满足不同场景的需求。 首先,我们用Python语言来举例...

    字符串的操作,输入以字符串,然后排序

    在编程领域,字符串操作是日常开发中不可或缺的一部分。在这个任务中,我们主要关注的是如何对字符串中的字符进行排序。题目要求我们编写一个程序,能够接收用户输入的字符串,然后对这个字符串中的字符进行排序,并...

    C#实现调用打印机(打印字符串、打印绘图、打印图片),还差打印水晶报表

    本文将深入探讨如何使用C#实现打印字符串、绘图和图片,并简要提及水晶报表打印的缺失部分。 一、打印字符串 在C#中,我们可以使用`System.Drawing.Printing`命名空间下的`PrintDocument`类来实现打印字符串。首先...

    字符串类报告(里面包含源代码)

    - `Print()` 函数用于打印字符串内容。 11. **私有函数**: - `SetValue(char* src)` 是一个私有函数,用于设置字符串的值,可能在构造函数和赋值操作中使用。 通过这些成员函数,`TString`类能够执行基本的字符...

    Python 字符串操作方法大全

    在 Python 编程语言中,字符串是最常用的数据类型之一。由于其广泛的应用场景,掌握字符串的各种操作方法对于提高编程效率至关重要。本文档提供了全面的 Python 字符串操作方法汇总,包括但不限于替换、删除、截取、...

Global site tag (gtag.js) - Google Analytics