Класс Java: как создать класс, который возвращает строковый параметр, но может также использоваться в качестве точки входа для приложения?

Следуя разделу «ТРУБА СО СТРУНКАМИ» этого руководства: http://www.jonathanbeard.io/tutorials/CtoJava

Я хочу изменить код StreamTest, чтобы сохранить данные в переменной и передать их другому классу.

Я пробовал это сделать (см. Ниже), но когда я запустил java -cp. StreamTest из учебника я получаю следующее:

Основной метод не найден в классе StreamTest, определите основной метод как: public static void main (String [] args)

Думаю, в этом есть смысл, но сейчас я не знаю, как к этому подойти.

Основная идея заключается в том, что я хочу иметь возможность получать данные из кода c, помещать их в проход переменной (я думаю, через код StreamTest), а затем передавать эту переменную в мой класс mainLaptop

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;

}
}

Вот основной класс, в который я хочу передать данные

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;
}

Вот файл make

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);

}    
}
main() - это точка входа - если другой класс является частью того же приложения Java, вы можете вызвать его метод из main, передав имеющуюся строку.
Vasan 31.05.2018 02:31

Я вызываю класс StreamTest для другого своего класса следующим образом: String pass = null; пройти = StreamTest.main (аргумент, пройти); Но перед запуском этого класса / приложения мне нужно запустить StreamTest с терминала следующим образом: 1 make StreamTest 2 make c_app 3 java -cp. StreamTest 4 ./c_app, но опять же проблема на шаге 3. Я получаю сообщение об ошибке выше (в моем сообщении), потому что вместо этого: public static void main (String [] args) У меня это как public static String

Jas 31.05.2018 03:02

Я думаю, у вас тут проблема с дизайном. Возможно, вам поможет публикация ваших полных требований. Как есть, это проблема XY. Вы делаете что-то нелогичное, но, возможно, этого требуют ваши требования - мы не сможем узнать, пока вы не опишете

Vasan 31.05.2018 06:38

Я думал запустить эти команды: 1 make StreamTest 2 make c_app 3 java -cp. StreamTest 4 ./c_app в терминале, чем компиляция и запуск mainLaptop в eclipse, но, возможно, это неправильный способ сделать это

Jas 31.05.2018 08:11

Но основная идея заключается в том, что я хочу иметь возможность получать данные из кода c, помещать их в проход переменной, а затем передавать эту переменную в мой класс mainLaptop.

Jas 31.05.2018 08:12

Классы не возвращают методы, а классы не являются точками входа. Классы имеют методы, а методы могут возвращать строки или быть точками входа ('public static void main (String [] args)').

user207421 31.05.2018 10:08

Я обновил свой код, поэтому вызываю mainLaptop в StreamTest, но не получаю желаемого результата. Какие-либо предложения?

Jas 31.05.2018 11:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы все неправильно поняли ... вы бежите

java -cp

Итак, это пытается запустить ваше приложение, отсюда и ошибка, заключающаяся в том, что он не может найти метод Main, потому что Java ищет метод Main при попытке запустить приложение ...

Если вы хотите сохранить данные, просто передайте данные в команду следующим образом

java -cp . class "the string you want"

И затем в основном методе у вас есть "String args []", читающий это из этого :)

РЕДАКТИРОВАТЬ

@Jas Buddy, что ты делаешь ??? как у вас может быть два основных метода ....? scrap 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);*/
}
}

ЕСЛИ вы запускаете его из затмения Щелкните правой кнопкой мыши "Выполнить" -> "Выполнить конфигурацию" -> "Аргументы".

Вывод будет «подростковый мутант», потому что мы взяли только args [0], если вам нужны другие значения, тогда arg1, args2 ...

если вы хотите запустить его в commandLine, тогда

Хорошо, поэтому, если я хочу поместить данные в свой класс mainLaptop (я добавил его выше), все, что мне нужно сделать, это java -cp. mainLaptop "пройти"?

Jas 31.05.2018 07:55

@Jas в значительной степени да ... попробуйте без кавычек вроде "java -cp. MainLaptop pass", и вы сможете получить это в своем основном методе, используя args [0]

rohit thomas 31.05.2018 10:25

Я получаю сообщение об ошибке: не удалось найти или загрузить основной класс mainLaptop, хотя я изменил код c, чтобы использовать mainLaptop вместо StreamTest

Jas 31.05.2018 11:15

это проблема пути к классу, вы внутри пакета ??

rohit thomas 31.05.2018 12:14

Я могу отправить вам экспорт моего проекта. У меня есть классы / файлы StreamTest, mainLaptop и Send в пакете src. Я обновил свой пост, указав, как теперь выглядит мой класс StreamTest, но данные не передаются в мою переменную pass, когда я запускаю StreamTest в eclipse

Jas 31.05.2018 12:31

Другие вопросы по теме