Java Class:如何使 class 和 returns 成为字符串参数但也可以用作应用程序的入口点?

Java Class: How would I make a class that returns a string parameter but can also be used as an entry point for an application?

按照本教程的 "PIPE WITH STRINGS" 部分:http://www.jonathanbeard.io/tutorials/CtoJava

我想修改 StreamTest 代码,以便我可以将数据保存到一个变量并将其传递给另一个 class。

我尝试这样做(见下文)但是当我 运行 java -cp 时。流测试 从教程中我得到这个:

在class StreamTest中找不到Main方法,请定义main方法 如:public static void main(String[] args)

我想这是有道理的,但我现在有点卡在如何处理这个问题上。

大意是我希望能够从c代码中获取数据,放入变量pass中(我猜是通过StreamTest代码),然后将该变量传递给我的笔记本电脑 class

import java.io.BufferedInputStream; 
import java.io.IOException;
import java.io.InputStream;

public class StreamTest
{
private static final int buffer = 4096;
public static String main(String [] args, String pass)
{

    InputStream is = null;
    BufferedInputStream bis = null;
    try
    {
        bis = new BufferedInputStream(System.in,buffer);
        StringBuilder sb = new StringBuilder();
        sb.append((char)bis.read());
        while(bis.available() > 0)
        {
            sb.append((char)bis.read());
        }

        System.out.println("JAVA SIDE: "+sb.toString());
        pass=sb.toString();
        bis.close();

    }
    catch(IOException ex){}
    finally{}
    //return pass;
    return pass;

}
}

这里是主要的class我想把数据传进去

public class mainLaptop 
{

public static void main(String arg) throws Exception 
{   
    //Timing out? change the IP!
    String ip="192.168.137.127";
    String Pi1Q1="Leonardo";
    String Pi1Q2="Raphael";
    String Pi2Q3="Donatello";
    String Pi2Q4="Michelangelo";
    String pass=arg;
    //pass= StreamTest.main(pass);

    Send.send(ip, Pi1Q1, pass);
    Send.send(ip, Pi1Q2, pass);
    Send.send(ip, Pi2Q3, pass);
    Send.send(ip, Pi2Q4, pass);

/*  Recv.recv(ip, Pi1Q1);
    Recv.recv(ip, Pi1Q2);
    Recv.recv(ip, Pi2Q3);
    Recv.recv(ip, Pi2Q4);*/
}
}

这是有效的未修改 StreamTest

import java.io.BufferedInputStream; 
import java.io.IOException;
import java.io.InputStream;

public class StreamTest
   {
    private static final int buffer = 4096;

   public static void main(String[] args) throws Exception 
  {   
    String pass=null;
    InputStream is = null;
    BufferedInputStream bis = null;
    try
    {
        bis = new BufferedInputStream(System.in,buffer);
        StringBuilder sb = new StringBuilder();
        //sb.append((char)bis.read());
        while(bis.available() > 0){
            sb.append((char)bis.read());
        }
        pass = sb.toString();
        System.out.println("JAVA SIDE: "+sb.toString());
        bis.close();
    }
    catch(IOException ex)
    {

    }

    finally
    {


    }

  //  mainLaptop.main(pass);

}

这是c代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <inttypes.h>

#define DEBUG 0
#define BUFFER 4096

//open ap.txt for text input
static const char* exFile = "ap.txt";
static char inputBuffer[BUFFER];

int main(int argc, const char** argv)
{
   FILE *fp = fopen(exFile,"r");
   /*check and see if the pointer is null in otherwords see if the memory 
   location refered to by fp is set...no memory location should be zero 
   if you want to reference it   
   Here are some good ways to do this other than the way I did it below:
   if(!fp) {do error}
   if(fp == NULL) {do error}
   and then there's the way I did it below
   */

   if(fp == 0){
      fprintf(stderr,"Null pointer exception, check file name.\n");
      exit(-1);
   }

   //check and see if an error occured during open
   const int err = ferror(fp);
   if(err != 0){
      /*
     void perror(const char* err)
     returns specific error message to string attached.

     */
  const char* errMessage = strcat("Something bad happened while opening 
  file ",exFile);
  perror(errMessage);
   }
     #if (DEBUG == 1)   
    else
    {
      fprintf(stderr,"Success opening file!!\n");
    }  
    #endif




setbuf(fp,inputBuffer); //set a buffer for input

uint64_t *num = (uint64_t*) malloc(sizeof(uint64_t));
uint64_t total = 0;
uint64_t n = 0;

//test for eof
/*
feof(*fp) - returns a boolean true if at end of file and false otherwise
*/

while(!feof(fp)){
//fscanf returns the number of items it converted using %llu, if it's not 
 equal to 1 we don't want to continue
   if(fscanf(fp,"%"PRIu64"",num)!=1)
  break; //you could do a lot of stuff here as far as error handling but 
basically something bad has happened
   total+= *num; //add to total the value at memory location num
   n++;
    #if (DEBUG == 1)   
    fprintf(stderr,"line number %"PRIu64"\n",n);
    #endif 
    }

    free(num);

const double average = (double) total / (double) n;
//close the inputfile
fclose(fp);

//declare our outputfile, use a pipe in this case to a java process
//we open a java process for this process to pipe to, also it is 
//technically a bi-directional pipe so we can use any of the modifiers
//like r/w/r+/etc
static const char* outFile = "java -cp . StreamTest";

FILE *fp_out = popen(outFile,"w");
//setbuf(fp_out,outputBuffer);

fprintf(fp_out,"Total: %"PRIu64", Integers: %"PRIu64", Average: 
%.4f\n",total,n,average);



/*
int fflush(*fp) pushes any data in the buffer to be written
the return value returns 0 if successful or !=0 if an error 
occurs....remember return values in C often equal exceptions

*/   
   fflush(fp_out);

/*

int 

 */
    fclose(fp_out);

   return 1;
}

这是生成文件

CC ?=gcc
JCC ?= javac
FLAGS ?= -Wall -O2
JFLAGS ?= -g -verbose

all: c_app StreamTest

c_app: c_app.c
    $(CC) $(FLAGS) -o c_app c_app.c

StreamTest: StreamTest.java
    $(JCC) $(JFLAGS) StreamTest.java $(LIBS)

clean:
    rm -f c_app StreamTest.class

ap.text 文件只是一串数字

我已经更新了我的 StreamTest 代码并通过 eclipse 运行 它但我的输出是

JAVA SIDE: 
 [x] Sent ''Leonardo
 [x] Sent ''Raphael
 [x] Sent ''Donatello
 [x] Sent ''Michelangelo

而不是

JAVA SIDE: 
 [x] Sent 'Total: 4953, Integers: 1000, Average: 4.9530'Leonardo
 [x] Sent 'Total: 4953, Integers: 1000, Average: 4.9530'Raphael
 [x] Sent 'Total: 4953, Integers: 1000, Average: 4.9530'Donatello
 [x] Sent 'Total: 4953, Integers: 1000, Average: 4.9530'Michelangelo

已更新 StreamTest

import java.io.BufferedInputStream; 
import java.io.IOException;
import java.io.InputStream;

public class StreamTest
{
private static final int buffer = 4096;

public static void main(String[] args) throws Exception 
{
    String pass=null;
    InputStream is = null;
    BufferedInputStream bis = null;
    try
    {
        bis = new BufferedInputStream(System.in,buffer);
        StringBuilder sb = new StringBuilder();
        //sb.append((char)bis.read());
        while(bis.available() > 0){
            sb.append((char)bis.read());
        }
        pass = sb.toString();
        System.out.println("JAVA SIDE: "+pass);
        bis.close();
    }
    catch(IOException ex)
    {

    }

    finally
    {


    }
    //pass = "hi";
    mainLaptop.main(pass);

}    
}

你完全错了...你 运行宁

java -cp

所以这是在尝试 运行 您的应用程序,因此出现错误,它找不到 Main 方法,因为 Java 在尝试 运行 应用程序时寻找 Main 方法...

如果你想保存数据,只需像这样将数据传递到命令中

java -cp . class "the string you want"

然后在主要方法中,"String args[]" 从中读取它:)

已编辑

@Jas Buddy 你在做什么???你怎么能有两个主要方法....?废弃 StreamTest 仅使用 mainLaptop ....

public class mainLaptop 
{

public static void main(String arg) throws Exception 
{   
    //Timing out? change the IP!
    String ip="192.168.137.127";
    String Pi1Q1="Leonardo";
    String Pi1Q2="Raphael";
    String Pi2Q3="Donatello";
    String Pi2Q4="Michelangelo";
    String pass=arg[0]; // reads the argument you pass from command line or eclipse
    //pass= StreamTest.main(pass);

    Send.send(ip, Pi1Q1, pass);
    Send.send(ip, Pi1Q2, pass);
    Send.send(ip, Pi2Q3, pass);
    Send.send(ip, Pi2Q4, pass);

/*  Recv.recv(ip, Pi1Q1);
    Recv.recv(ip, Pi1Q2);
    Recv.recv(ip, Pi2Q3);
    Recv.recv(ip, Pi2Q4);*/
}
}

如果您运行从 eclipse 中安装它 右击运行-->运行配置-->参数

输出将是 "teenagemutant" 因为我们只取了 args[0],如果你想要其他值那么 arg1,args2...

如果你想 运行 它在命令行上然后